diff --git a/machines/compute01/_configuration.nix b/machines/compute01/_configuration.nix index 8c8225f..f318fff 100644 --- a/machines/compute01/_configuration.nix +++ b/machines/compute01/_configuration.nix @@ -13,6 +13,7 @@ let # List of services to enable enabledServices = [ + "ds-fr" "kanidm" "mastodon" "nextcloud" diff --git a/machines/compute01/ds-fr/default.nix b/machines/compute01/ds-fr/default.nix new file mode 100644 index 0000000..ef318a0 --- /dev/null +++ b/machines/compute01/ds-fr/default.nix @@ -0,0 +1,77 @@ +{ config, lib, dgn-lib, ... }: + +let + inherit (dgn-lib) setDefault; + + host = "demarches.dgnum.eu"; +in { + imports = [ ./module.nix ]; + + services.demarches-simplifiees = { + enable = true; + + secretFile = config.age.secrets.ds_fr-secret_file.path; + + initialDeploymentDate = "20230923"; + + settings = { + APP_HOST = host; + + # TODO: use France Connect ? + FRANCE_CONNECT_ENABLED = "disabled"; + FC_PARTICULIER_ID = "demarches_dgn"; + FC_PARTICULIER_SECRET = "JD2MKKR3aMapqk1f27AcMZMy8sTW7ypRkqcegvf5TUy8bMRp"; + FC_PARTICULIER_BASE_URL = "https://sso.dgnum.eu"; + + # S3 storage setup + ACTIVE_STORAGE_SERVICE = "garage"; + S3_ENDPOINT = "https://s3.dgnum.eu"; + S3_BUCKET = "demarches-dgnum"; + S3_REGION = "garage"; + S3_FORCE_PATH_STYLE = "true"; + S3_ACCESS_KEY_ID = "GK4d244118eac2336ae0ab2dd9"; + S3_SECRET_ACCESS_KEY = "61100261fb0a0c861371596f9ffcd1e83134301a6d0c665a077135af04ba18c3"; + + # SAML_IDP_ENABLED = "enabled"; + + # Optional settings + APPLICATION_NAME = ''"Démarches normaliennes"''; + APPLICATION_SHORTNAME = "d-s.dgnum.eu"; + APPLICATION_BASE_URL = "https://${host}"; + + # Deactivate connexion methods + AGENT_CONNECT_ENABLED = "disabled"; + + # SMTP setup, TODO: Fix and stop using sendmail + CLASSIC_SMTP_ENABLED = "enabled"; + SMTP_HOST = "kurisu.lahfa.xyz"; + SMTP_PORT = "465"; + SMTP_USER = "web-services@infra.dgnum.eu"; + SMTP_TLS = ""; + SMTP_SSL = "true"; + SMTP_AUTHENTICATION = "plain"; + + SUPER_ADMIN_OTP_ENABLED = "disabled"; + + CONTACT_EMAIL = "demarches@infra.dgnum.eu"; + EQUIPE_EMAIL = "equipe@infra.dgnum.eu"; + TECH_EMAIL = "tech@infra.dgnum.eu"; + NO_REPLY_EMAIL = + ''"Ne pas répondre <@infra.dgnum.eu>"''; + OLD_CONTACT_EMAIL = ""; + CONTACT_PHONE = ""; + + # Customization + # HEADER_LOGO_SRC = "logo_ens_psl_couleur.png"; + # HEADER_LOGO_ALT = "Par la Recherche, pour la Recherche"; + # PROCEDURE_DEFAULT_LOGO_SRC = "logo_ens_psl_couleur.png"; + }; + }; + + dgn-secrets.options = [ + (setDefault { owner = "ds-fr"; } + (builtins.filter (lib.hasPrefix "ds_fr") config.dgn-secrets.names)) + ]; + + users.users.ds-fr.extraGroups = [ "sendmail" ]; +} diff --git a/machines/compute01/ds-fr/module.nix b/machines/compute01/ds-fr/module.nix new file mode 100644 index 0000000..9bccd53 --- /dev/null +++ b/machines/compute01/ds-fr/module.nix @@ -0,0 +1,396 @@ +# Copyright Tom Hubrecht, (2023) +# +# Tom Hubrecht +# +# This software is a computer program whose purpose is to configure +# machines and servers with NixOS. +# +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. + +{ config, lib, pkgs, ... }: + +let + inherit (lib) + mdDoc mkDefault mkEnableOption mkIf mkOption + + optional optionalString + + types; + + cfg = config.services.demarches-simplifiees; + + settingsFormat = pkgs.formats.keyValue { }; + + env = settingsFormat.generate "ds-fr-env" cfg.settings; + + ds-fr = pkgs.writeShellScriptBin "ds-fr" '' + set -a + cd ${cfg.package} + + ${optionalString (cfg.secretFile != null) "source ${cfg.secretFile}"} + source ${env} + + BIN="$1" + shift + + SUDO="exec" + if [[ $USER != ${cfg.user} ]]; then + SUDO='exec /run/wrappers/bin/sudo -u ${cfg.user} --preserve-env' + fi + + $SUDO ${cfg.package}/bin/$BIN "$@" + ''; + +in { + options.services.demarches-simplifiees = { + enable = mkEnableOption "demarches-simplifiees."; + + package = mkOption { + type = types.package; + default = pkgs.callPackage ./package { + inherit (cfg) initialDeploymentDate dataDir logDir; + }; + }; + + user = mkOption { + type = types.str; + default = "ds-fr"; + description = mdDoc "User account under which DS runs."; + }; + + group = mkOption { + type = types.str; + default = "ds-fr"; + description = mdDoc "Group account under which DS runs."; + }; + + dataDir = mkOption { + type = types.str; + default = "/var/lib/ds-fr"; + }; + + logDir = mkOption { + type = types.str; + default = "/var/log/ds-fr"; + }; + + secretFile = mkOption { + type = types.nullOr types.path; + default = null; + }; + + settings = mkOption { inherit (settingsFormat) type; }; + + initialDeploymentDate = mkOption { + type = types.nullOr types.str; + default = null; + }; + }; + + config = mkIf cfg.enable { + services.demarches-simplifiees.settings = + (builtins.mapAttrs (_: mkDefault) { + RAILS_ENV = "production"; + RAILS_ROOT = builtins.toString cfg.package; + + # Application host name + # + # Examples: + # * For local development: localhost:3000 + # * For preproduction: staging.ds.example.org + # * For production: ds.example.org + APP_HOST = "localhost:3000"; + + # Rails key for signing sensitive data + # See https://guides.rubyonrails.org/security.html + # + # For production you MUST generate a new key, and keep it secret. + # Secrets must be long and random. Use bin/rails secret to get new unique secrets. + + # Secret key for One-Time-Password codes, used for 2-factors authentication + # OTP_SECRET_KEY = ""; + + # Protect access to the instance with a static login/password (useful for staging environments) + BASIC_AUTH_ENABLED = "disabled"; + BASIC_AUTH_USERNAME = ""; + BASIC_AUTH_PASSWORD = ""; + + # ActiveStorage service to use for attached files. + # Possible values: + # - "local": store files on the local filesystem + # - "amazon": store files remotely on an S3 storage service + # - "openstack": store files remotely on an OpenStack storage service + # + # (See config/storage.yml for the configuration of each service.) + ACTIVE_STORAGE_SERVICE = "local"; + + # Configuration for the OpenStack storage service (if enabled) + FOG_OPENSTACK_API_KEY = ""; + FOG_OPENSTACK_USERNAME = ""; + FOG_OPENSTACK_URL = ""; + FOG_OPENSTACK_REGION = ""; + DS_PROXY_URL = ""; + + # SAML + SAML_IDP_ENABLED = "disabled"; + + # External service: authentication through France Connect + FC_PARTICULIER_ID = ""; + FC_PARTICULIER_SECRET = ""; + FC_PARTICULIER_BASE_URL = ""; + + # External service: authentication through Agent Connect + AGENT_CONNECT_ID = ""; + AGENT_CONNECT_SECRET = ""; + AGENT_CONNECT_BASE_URL = ""; + AGENT_CONNECT_JWKS = ""; + AGENT_CONNECT_REDIRECT = ""; + + # External service: integration with HelpScout (optional) + HELPSCOUT_MAILBOX_ID = ""; + HELPSCOUT_CLIENT_ID = ""; + HELPSCOUT_CLIENT_SECRET = ""; + HELPSCOUT_WEBHOOK_SECRET = ""; + + # External service: external supervision + SENTRY_ENABLED = "disabled"; + SENTRY_CURRENT_ENV = "development"; + SENTRY_DSN_RAILS = ""; + SENTRY_DSN_JS = ""; + + # External service: Matomo web analytics + MATOMO_ENABLED = "disabled"; + MATOMO_COOKIE_DOMAIN = "*.www.demarches-simplifiees.fr"; + MATOMO_DOMAIN = "*.www.demarches-simplifiees.fr"; + MATOMO_ID = ""; + MATOMO_HOST = "matomo.example.org"; + + # Default SMTP Provider: Mailjet + MAILJET_API_KEY = ""; + MAILJET_SECRET_KEY = ""; + + # Alternate SMTP Provider: SendInBlue/DoList + SENDINBLUE_CLIENT_KEY = ""; + SENDINBLUE_SMTP_KEY = ""; + SENDINBLUE_USER_NAME = ""; + # SENDINBLUE_LOGIN_URL="https://app.sendinblue.com/account/saml/login/truc" + + # Alternate SMTP Provider: Mailtrap (mail catcher for staging environments) + # When enabled, all emails will be sent using this provider + MAILTRAP_ENABLED = "disabled"; + MAILTRAP_USERNAME = ""; + MAILTRAP_PASSWORD = ""; + + # Alternative SMTP Provider: Mailcatcher (Catches mail and serves it through a dream.) + # When enabled, all emails will be sent using this provider + MAILCATCHER_ENABLED = "disabled"; + MAILCATCHER_HOST = ""; + MAILCATCHER_PORT = ""; + + # External service: live chat for admins (specific to démarches-simplifiées.fr) + CRISP_ENABLED = "disabled"; + CRISP_CLIENT_KEY = ""; + + # API Entreprise credentials + # https://api.gouv.fr/api/api-entreprise.html + API_ENTREPRISE_KEY = ""; + + # External service: CRM for following admin accounts pipeline (specific to démarches-simplifiées.fr) + PIPEDRIVE_KEY = ""; + + # Networks bypassing the email login token that verifies new devices, and rack-attack throttling + TRUSTED_NETWORKS = ""; + + # External service: mesuring performance of the Rails app (specific to démarches-simplifiées.fr) + SKYLIGHT_AUTHENTICATION_KEY = ""; + # "sXaot-fKhBlkI8qaSirQyuZbrpv5sVFoOturQ0pFEh0"; + + # Enable or disable Lograge logs + LOGRAGE_ENABLED = "disabled"; + + # Logs source for Lograge + # + # Examples: + # * For local development: tps_local + # * For preproduction: tps_staging + # * For production: tps_prod + LOGRAGE_SOURCE = "tps_prod"; + + # External service: timestamping a daily archive of dossiers status changes + UNIVERSIGN_API_URL = "https://ws.universign.eu/tsa/post/"; + UNIVERSIGN_USERPWD = ""; + + # External service: API Geo / Adresse + API_ADRESSE_URL = "https://api-adresse.data.gouv.fr"; + API_GEO_URL = "https://geo.api.gouv.fr"; + + # External service: API Education + API_EDUCATION_URL = "https://data.education.gouv.fr/api/records/1.0"; + + # Encryption key for sensitive columns in the database + ENCRYPTION_SERVICE_SALT = ""; + + # ActiveRecord encryption keys. Generate them with bin/rails db:encryption:init (you can omit deterministic_key) + AR_ENCRYPTION_PRIMARY_KEY = ""; + AR_ENCRYPTION_KEY_DERIVATION_SALT = ""; + + # Salt for invisible_captcha session data. + # Must be the same value for all app instances behind a load-balancer. + INVISIBLE_CAPTCHA_SECRET = "kikooloool"; + + # Clamav antivirus usage + CLAMAV_ENABLED = "disabled"; + + # Siret number used for API Entreprise, by default we use SIRET from dinum + API_ENTREPRISE_DEFAULT_SIRET = "put_your_own_siret"; + }) // { + # Database credentials + DB_DATABASE = "ds-fr"; + DB_USERNAME = cfg.user; + DB_PASSWORD = ""; + DB_HOST = "/run/postgresql"; + DB_POOL = ""; + + # Log on stdout + RAILS_LOG_TO_STDOUT = true; + }; + + environment.systemPackages = [ ds-fr ]; + + systemd.tmpfiles.rules = [ + "f '${cfg.logDir}/production.log' 0640 ${cfg.user} ${cfg.group} - -" + "f '${cfg.dataDir}/.env' 0600 ${cfg.user} ${cfg.group} - -" + "d '${cfg.dataDir}/tmp' 0700 ${cfg.user} ${cfg.group} 10d -" + ]; + + systemd.services = { + ds-fr-setup = { + description = "Demarches Simplifiees setup"; + + wantedBy = [ "multi-user.target" ]; + path = [ pkgs.bash ds-fr ]; + after = [ "postgresql.service" ]; + + serviceConfig = { + Type = "oneshot"; + User = cfg.user; + Group = cfg.group; + EnvironmentFile = [ env ] + ++ (optional (cfg.secretFile != null) cfg.secretFile); + StateDirectory = mkIf (cfg.dataDir == "/var/lib/ds-fr") "ds-fr"; + LogsDirectory = mkIf (cfg.logDir == "/var/log/ds-fr") "ds-fr"; + }; + + script = '' + [[ ! -f ${cfg.dataDir}/.initial-migration ]] \ + && ds-fr rails db:environment:set \ + && ds-fr rails db:schema:load \ + && ds-fr rails db:seed \ + && touch ${cfg.dataDir}/.initial-migration + + ds-fr rake db:migrate + ds-fr rake after_party:run + ''; + }; + + ds-fr-work = { + description = "Demarches Simplifiees work service"; + + wantedBy = [ "multi-user.target" "ds-fr.service" ]; + after = [ "network.target" "ds-fr-setup.service" ]; + requires = [ "ds-fr-setup.service" ]; + + serviceConfig = { + ExecStart = "${ds-fr}/bin/ds-fr rails jobs:work"; + EnvironmentFile = [ env ] + ++ (optional (cfg.secretFile != null) cfg.secretFile); + User = cfg.user; + Group = cfg.group; + StateDirectory = mkIf (cfg.dataDir == "/var/lib/ds-fr") "ds-fr"; + LogsDirectory = mkIf (cfg.logDir == "/var/log/ds-fr") "ds-fr"; + }; + }; + + ds-fr = { + description = "Demarches Simplifiees web service"; + + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "ds-fr-setup.service" ]; + requires = [ "ds-fr-setup.service" ]; + + serviceConfig = { + ExecStart = "${ds-fr}/bin/ds-fr rails server"; + Environment = [ "RAILS_QUEUE_ADAPTER=delayed_job" ]; + EnvironmentFile = [ env ] + ++ (optional (cfg.secretFile != null) cfg.secretFile); + User = cfg.user; + Group = cfg.group; + StateDirectory = mkIf (cfg.dataDir == "/var/lib/ds-fr") "ds-fr"; + LogsDirectory = mkIf (cfg.logDir == "/var/log/ds-fr") "ds-fr"; + }; + }; + }; + + services.postgresql = { + enable = true; + + ensureDatabases = [ "ds-fr" ]; + + ensureUsers = optional (cfg.user == "ds-fr") { + name = "ds-fr"; + ensurePermissions = { "DATABASE \"ds-fr\"" = "ALL PRIVILEGES"; }; + }; + + extraPlugins = with config.services.postgresql.package.pkgs; [ postgis ]; + }; + + users.users = mkIf (cfg.user == "ds-fr") { + ds-fr = { + inherit (cfg) group; + + isSystemUser = true; + home = cfg.package; + }; + }; + + users.groups.${cfg.group} = { }; + + services.nginx = { + enable = true; + + virtualHosts.${cfg.settings.APP_HOST} = { + enableACME = true; + forceSSL = true; + root = "${cfg.package}/public/"; + + locations."/".tryFiles = "$uri @proxy"; + locations."@proxy" = { proxyPass = "http://127.0.0.1:3000"; }; + }; + }; + + }; +} diff --git a/machines/compute01/ds-fr/package/default.nix b/machines/compute01/ds-fr/package/default.nix new file mode 100644 index 0000000..919411b --- /dev/null +++ b/machines/compute01/ds-fr/package/default.nix @@ -0,0 +1,129 @@ +{ lib, stdenv, fetchFromGitHub, fetchYarnDeps, yarn, fixup_yarn_lock, nodejs, ruby_3_2 +, bundlerEnv, logDir ? "/var/log/ds-fr", dataDir ? "/var/lib/ds-fr" +, initialDeploymentDate ? "17941030" }: + +let + pname = "ds-fr"; + version = "2023-09-21-01"; + + src = fetchFromGitHub { + owner = "demarches-simplifiees"; + repo = "demarches-simplifiees.fr"; + rev = "2023-09-21-01"; + hash = "sha256-4HGnv3atCkftK4AbmlYSj2BwDfgZ0jRREYqd1WhJbv0="; + }; + + rubyEnv = bundlerEnv { + name = "env-${pname}"; + gemdir = ./rubyEnv; + ruby = ruby_3_2; + gemset = (import ./rubyEnv/gemset.nix) // { + bundler = { + groups = [ "default" ]; + platforms = [ ]; + source = { + remotes = [ "https://rubygems.org" ]; + sha256 = "deeQ3fNwcSiGSO/yeB2yoTniRq2gHW8WueprXoPX6Jk="; + type = "gem"; + }; + version = "2.3.11"; + }; + }; + }; + + dsModules = stdenv.mkDerivation { + pname = "${pname}-modules"; + inherit src version; + + offlineCache = fetchYarnDeps { + yarnLock = "${src}/yarn.lock"; + hash = "sha256-c2al1GBgSaUOT3veq5u3Wpj3Y+SfoiFxt97vppSD67s="; + }; + + buildInputs = [ rubyEnv ]; + nativeBuildInputs = [ fixup_yarn_lock nodejs yarn rubyEnv.wrappedRuby ]; + + RAILS_ENV = "production"; + NODE_ENV = "dev"; + + patches = [ + # Disable functionnalities as we only precompile assets + ./patches/build.patch + ]; + + OTP_SECRET_KEY = "precompile_placeholder"; + SECRET_KEY_BASE = "precompile_placeholder"; + APP_HOST = "precompile_placeholder"; + + buildPhase = '' + export HOME=$(mktemp -d) + yarn config --offline set yarn-offline-mirror $offlineCache + fixup_yarn_lock yarn.lock + yarn install --offline --frozen-lockfile --ignore-platform --ignore-scripts --no-progress --non-interactive + + patchShebangs node_modules/ + patchShebangs bin/ + + bin/rake assets:precompile + + yarn cache clean --offline + rm -rf node_modules/ + ''; + + installPhase = '' + mkdir -p $out/public + cp -r public/* $out/public + ''; + }; + +in stdenv.mkDerivation { + name = "demarches-simplifiees.fr-${version}"; + + inherit src; + + buildInputs = [ rubyEnv ]; + propagatedBuildInputs = [ rubyEnv.wrappedRuby ]; + + patches = [ + ./patches/replay_routing_engine_for_a_cloned_procedure.patch + ./patches/smtp_settings.patch + ./patches/garage.patch + ./patches/secrets-fc.patch + ]; + + buildPhase = '' + rm -rf public + ln -s ${dsModules}/public/ public + + patchShebangs bin/ + + rm -rf log + ln -s ${logDir} log + ln -s ${dataDir}/tmp tmp + + for f in $(ls lib/tasks/deployment/); do + [[ ! ${initialDeploymentDate} < $f ]] \ + && rm lib/tasks/deployment/$f; + done; + + echo "Removed unused data migrations" + ''; + + installPhase = '' + mkdir -p $out + cp -r * $out/ + ''; + + passthru = { + inherit rubyEnv; + ruby = rubyEnv.wrappedRuby; + }; + + meta = with lib; { + description = "Dématérialiser et simplifier les démarches administratives"; + homepage = + "https://github.com/demarches-simplifiees/demarches-simplifiees.fr"; + license = licenses.agpl3Only; + maintainers = with maintainers; [ thubrecht ]; + }; +} diff --git a/machines/compute01/ds-fr/package/patches/build.patch b/machines/compute01/ds-fr/package/patches/build.patch new file mode 100644 index 0000000..07be2d0 --- /dev/null +++ b/machines/compute01/ds-fr/package/patches/build.patch @@ -0,0 +1,64 @@ +diff --git a/config/environments/production.rb b/config/environments/production.rb +index 16d8c8e84..6262b8782 100644 +--- a/config/environments/production.rb ++++ b/config/environments/production.rb +@@ -118,7 +118,7 @@ Rails.application.configure do + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + +- config.active_storage.service = ENV.fetch("ACTIVE_STORAGE_SERVICE").to_sym ++ config.active_storage.service = ENV.fetch("ACTIVE_STORAGE_SERVICE", 'local').to_sym + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify +@@ -174,5 +174,5 @@ Rails.application.configure do + # The Content-Security-Policy is NOT in Report-Only mode + config.content_security_policy_report_only = false + +- config.lograge.enabled = ENV['LOGRAGE_ENABLED'] == 'enabled' ++ config.lograge.enabled = ENV.fetch('LOGRAGE_ENABLED', 'disabled') == 'enabled' + end + +diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb +index 135495216..4d4bcf8dc 100644 +--- a/config/initializers/content_security_policy.rb ++++ b/config/initializers/content_security_policy.rb +@@ -23,7 +23,7 @@ Rails.application.config.content_security_policy do |policy| + connect_whitelist = ["wss://*.crisp.chat", "*.crisp.chat", "app.franceconnect.gouv.fr", "openmaptiles.geo.data.gouv.fr", "openmaptiles.github.io", "tiles.geo.api.gouv.fr", "wxs.ign.fr"] + connect_whitelist << ENV.fetch('APP_HOST') + connect_whitelist << "*.amazonaws.com" if Rails.configuration.active_storage.service == :amazon +- connect_whitelist += [URI(ENV["SENTRY_DSN_JS"]).host, URI(ENV["SENTRY_DSN_RAILS"]).host].compact.uniq ++ connect_whitelist += [URI(ENV.fetch("SENTRY_DSN_JS", '')).host, URI(ENV.fetch("SENTRY_DSN_RAILS", '')).host].compact.uniq + connect_whitelist << URI(DS_PROXY_URL).host if DS_PROXY_URL.present? + connect_whitelist << URI(API_ADRESSE_URL).host if API_ADRESSE_URL.present? + connect_whitelist << URI(API_EDUCATION_URL).host if API_EDUCATION_URL.present? +@@ -39,7 +39,7 @@ Rails.application.config.content_security_policy do |policy| + # Everything else: allow us + # Add the error source in the violation notification + default_whitelist = ["fonts.gstatic.com", "in-automate.sendinblue.com", "player.vimeo.com", "app.franceconnect.gouv.fr", "*.crisp.chat", "crisp.chat", "*.crisp.help", "*.sibautomation.com", "sibautomation.com", "data"] +- default_whitelist += [URI(ENV["SENTRY_DSN_JS"]).host, URI(ENV["SENTRY_DSN_RAILS"]).host].compact.uniq ++ default_whitelist += [URI(ENV.fetch("SENTRY_DSN_JS", '')).host, URI(ENV.fetch("SENTRY_DSN_RAILS", '')).host].compact.uniq + default_whitelist << URI(DS_PROXY_URL).host if DS_PROXY_URL.present? + policy.default_src(:self, :data, :blob, :report_sample, *default_whitelist) + +diff --git a/config/initializers/mailcatcher.rb b/config/initializers/mailcatcher.rb +index 8b931f704..dbeceb4ec 100644 +--- a/config/initializers/mailcatcher.rb ++++ b/config/initializers/mailcatcher.rb +@@ -1,4 +1,4 @@ +-if ENV.fetch('MAILCATCHER_ENABLED') == 'enabled' ++if ENV.fetch('MAILCATCHER_ENABLED', 'disabled') == 'enabled' + ActiveSupport.on_load(:action_mailer) do + module Mailcatcher + class SMTP < ::Mail::SMTP; end + +diff --git a/config/initializers/mailtrap.rb b/config/initializers/mailtrap.rb +index 6d1faa04b..658673ed1 100644 +--- a/config/initializers/mailtrap.rb ++++ b/config/initializers/mailtrap.rb +@@ -1,4 +1,4 @@ +-if ENV.fetch('MAILTRAP_ENABLED') == 'enabled' ++if ENV.fetch('MAILTRAP_ENABLED', 'disabled') == 'enabled' + ActiveSupport.on_load(:action_mailer) do + module Mailtrap + class SMTP < ::Mail::SMTP; end diff --git a/machines/compute01/ds-fr/package/patches/garage.patch b/machines/compute01/ds-fr/package/patches/garage.patch new file mode 100644 index 0000000..4d57c64 --- /dev/null +++ b/machines/compute01/ds-fr/package/patches/garage.patch @@ -0,0 +1,16 @@ +diff --git a/config/storage.yml b/config/storage.yml +index d2b2d241f..1b2744504 100644 +--- a/config/storage.yml ++++ b/config/storage.yml +@@ -19,3 +19,11 @@ amazon: + secret_access_key: <%= ENV.fetch("S3_SECRET_ACCESS_KEY", "") %> + region: <%= ENV.fetch("S3_REGION", "") %> + bucket: <%= ENV.fetch("S3_BUCKET", "") %> ++garage: ++ service: S3 ++ access_key_id: <%= ENV.fetch("S3_ACCESS_KEY_ID", "") %> ++ secret_access_key: <%= ENV.fetch("S3_SECRET_ACCESS_KEY", "") %> ++ region: <%= ENV.fetch("S3_REGION", "garage") %> ++ bucket: <%= ENV.fetch("S3_BUCKET", "") %> ++ endpoint: <%= ENV.fetch("S3_ENDPOINT", "") %> ++ force_path_style: <%= ENV.fetch("S3_FORCE_PATH_STYLE", "").present? %> diff --git a/machines/compute01/ds-fr/package/patches/replay_routing_engine_for_a_cloned_procedure.patch b/machines/compute01/ds-fr/package/patches/replay_routing_engine_for_a_cloned_procedure.patch new file mode 100644 index 0000000..0d55ec4 --- /dev/null +++ b/machines/compute01/ds-fr/package/patches/replay_routing_engine_for_a_cloned_procedure.patch @@ -0,0 +1,35 @@ +diff --git a/lib/tasks/deployment/20230613114744_replay_routing_engine_for_a_cloned_procedure.rake b/lib/tasks/deployment/20230613114744_replay_routing_engine_for_a_cloned_procedure.rake +index 9d4f3a284..04d62a63b 100644 +--- a/lib/tasks/deployment/20230613114744_replay_routing_engine_for_a_cloned_procedure.rake ++++ b/lib/tasks/deployment/20230613114744_replay_routing_engine_for_a_cloned_procedure.rake +@@ -4,18 +4,18 @@ namespace :after_party do + puts "Running deploy task 'replay_routing_engine_for_a_cloned_procedure'" + + # Put your task implementation HERE. +- dossiers = Procedure +- .find(76266) +- .dossiers +- .en_construction +- +- progress = ProgressReport.new(dossiers.count) +- +- dossiers.find_each do |dossier| +- RoutingEngine.compute(dossier) +- progress.inc +- end +- progress.finish ++ # dossiers = Procedure ++ # .find(76266) ++ # .dossiers ++ # .en_construction ++ # ++ # progress = ProgressReport.new(dossiers.count) ++ # ++ # dossiers.find_each do |dossier| ++ # RoutingEngine.compute(dossier) ++ # progress.inc ++ # end ++ # progress.finish + + # Update task as completed. If you remove the line below, the task will + # run with every deploy (or every time you call after_party:run). diff --git a/machines/compute01/ds-fr/package/patches/secrets-fc.patch b/machines/compute01/ds-fr/package/patches/secrets-fc.patch new file mode 100644 index 0000000..b9c60dc --- /dev/null +++ b/machines/compute01/ds-fr/package/patches/secrets-fc.patch @@ -0,0 +1,39 @@ +diff --git a/config/secrets.yml b/config/secrets.yml +index 866fa6159..6fd49ee59 100644 +--- a/config/secrets.yml ++++ b/config/secrets.yml +@@ -23,10 +23,10 @@ defaults: &defaults + identifier: <%= ENV['FC_PARTICULIER_ID'] %> + secret: <%= ENV['FC_PARTICULIER_SECRET'] %> + redirect_uri: https://<%= ENV['APP_HOST'] %>/france_connect/particulier/callback +- authorization_endpoint: <%= ENV['FC_PARTICULIER_BASE_URL'] %>/api/v1/authorize +- token_endpoint: <%= ENV['FC_PARTICULIER_BASE_URL'] %>/api/v1/token +- userinfo_endpoint: <%= ENV['FC_PARTICULIER_BASE_URL'] %>/api/v1/userinfo +- logout_endpoint: <%= ENV['FC_PARTICULIER_BASE_URL'] %>/api/v1/logout ++ authorization_endpoint: <%= ENV['FC_PARTICULIER_BASE_URL'] %>/ui/oauth2 ++ token_endpoint: <%= ENV['FC_PARTICULIER_BASE_URL'] %>/oauth2/token ++ userinfo_endpoint: <%= ENV['FC_PARTICULIER_BASE_URL'] %>/oauth2/openid/demarches_dgn/userinfo ++ logout_endpoint: <%= ENV['FC_PARTICULIER_BASE_URL'] %>/oauth2/token/revoke + agent_connect: + identifier: <%= ENV['AGENT_CONNECT_ID'] %> + secret: <%= ENV['AGENT_CONNECT_SECRET'] %> +diff --git a/app/services/france_connect_service.rb b/app/services/france_connect_service.rb +index 31b2491c4..fd3d80530 100644 +--- a/app/services/france_connect_service.rb ++++ b/app/services/france_connect_service.rb +@@ -23,11 +23,15 @@ class FranceConnectService + + def self.retrieve_user_informations_particulier(code) + client = FranceConnectParticulierClient.new(code) ++ Rails.logger.fatal("Client: #{client.inspect}") ++ Rails.logger.fatal("Client token: #{client.access_token!(client_auth_method: :secret).userinfo!.inspect}") + + user_info = client.access_token!(client_auth_method: :secret) + .userinfo! + .raw_attributes + ++ Rails.logger.fatal("Info: #{user_info.inspect}") ++ + FranceConnectInformation.new( + gender: user_info[:gender], + given_name: user_info[:given_name], diff --git a/machines/compute01/ds-fr/package/patches/smtp_settings.patch b/machines/compute01/ds-fr/package/patches/smtp_settings.patch new file mode 100644 index 0000000..b364566 --- /dev/null +++ b/machines/compute01/ds-fr/package/patches/smtp_settings.patch @@ -0,0 +1,14 @@ +diff --git a/config/environments/production.rb b/config/environments/production.rb +index 16d8c8e84..e0326d26d 100644 +--- a/config/environments/production.rb ++++ b/config/environments/production.rb +@@ -86,7 +86,8 @@ Rails.application.configure do + user_name: ENV.fetch("SMTP_USER"), + password: ENV.fetch("SMTP_PASS"), + authentication: ENV.fetch("SMTP_AUTHENTICATION"), +- enable_starttls_auto: ENV.fetch("SMTP_TLS").present? ++ enable_starttls_auto: ENV.fetch("SMTP_TLS").present?, ++ ssl: ENV.fetch("SMTP_SSL").present? + } + elsif ENV['SENDMAIL_ENABLED'] == 'enabled' + config.action_mailer.delivery_method = :sendmail diff --git a/machines/compute01/ds-fr/package/rubyEnv/Gemfile b/machines/compute01/ds-fr/package/rubyEnv/Gemfile new file mode 100644 index 0000000..4d53d15 --- /dev/null +++ b/machines/compute01/ds-fr/package/rubyEnv/Gemfile @@ -0,0 +1,144 @@ +source 'https://rubygems.org' + +gem 'rails', '~> 7.0.5' # allows update to security fixes at any time + +gem 'aasm' +gem 'acsv' +gem 'active_link_to' # Automatically set a class on active links +gem 'active_model_serializers' +gem 'activestorage-openstack' +gem 'active_storage_validations' +gem 'addressable' +gem 'administrate' +gem 'administrate-field-enum' # Allow using Field::Enum in administrate +gem 'after_party' +gem 'anchored' +gem "aws-sdk-s3", require: false +gem 'bcrypt' +gem 'bootsnap', '>= 1.4.4', require: false # Reduces boot times through caching; required in config/boot.rb +gem 'browser' +gem 'charlock_holmes' +gem 'chartkick' +gem 'chunky_png' +gem 'clamav-client', require: 'clamav/client' +gem 'daemons' +gem 'deep_cloneable' # Enable deep clone of active record models +gem 'delayed_cron_job' # Cron jobs +gem 'delayed_job_active_record' +gem 'delayed_job_web' +gem 'devise' # Gestion des comptes utilisateurs +gem 'devise-i18n' +gem 'devise-two-factor' +gem 'discard' +gem 'dotenv-rails', require: 'dotenv/rails-now' # dotenv should always be loaded before rails +gem 'dry-monads' +gem 'elastic-apm' +gem 'flipper' +gem 'flipper-active_record' +gem 'flipper-ui' +gem 'fugit' +gem 'geocoder' +gem 'geo_coord', require: "geo/coord" +gem 'gon' +gem 'graphql' +gem 'graphql-batch' +gem 'graphql-rails_logger' +gem 'groupdate' +gem 'haml-rails' +gem 'hashie' +gem 'http_accept_language' +gem 'i18n_data' +gem 'i18n-tasks', require: false +gem 'iban-tools' +gem 'image_processing' +gem 'invisible_captcha' +gem 'json_schemer' +gem 'jwt' +gem 'kaminari' +gem 'listen' # Required by ActiveSupport::EventedFileUpdateChecker +gem 'lograge' +gem 'logstash-event' +gem 'mailjet', require: false +gem 'matrix' # needed by prawn and not default in ruby 3.1 +gem 'mini_magick' +gem 'net-imap', require: false # See https://github.com/mikel/mail/pull/1439 +gem 'net-pop', require: false # same +gem 'net-smtp', require: false # same +gem 'openid_connect' +gem 'parsby' +gem 'pg' +gem 'phonelib' +gem 'prawn-rails' # PDF Generation +gem 'premailer-rails' +gem 'puma' # Use Puma as the app server +gem 'pundit' +gem 'rack-attack' +gem 'rails-i18n' # Locales par défaut +gem 'rake-progressbar', require: false +gem 'redcarpet' +gem 'redis' +gem 'rexml' # add missing gem due to ruby3 (https://github.com/Shopify/bootsnap/issues/325) +gem 'rqrcode' +gem 'saml_idp' +gem 'sassc-rails' # Use SCSS for stylesheets +gem 'sentry-delayed_job' +gem 'sentry-rails' +gem 'sentry-ruby' +gem 'sib-api-v3-sdk' +gem 'skylight' +gem 'spreadsheet_architect' +gem 'strong_migrations' # lint database migrations +gem 'turbo-rails' +gem 'typhoeus' +gem 'ulid-ruby', require: 'ulid' +gem 'view_component' +gem 'vite_rails' +gem 'warden' +gem 'zipline' +gem 'zxcvbn-ruby', require: 'zxcvbn' + +group :test do + gem 'axe-core-rspec' # accessibility rspec matchers + gem 'capybara' # Integration testing + gem 'capybara-email' # Access emails during integration tests + gem 'capybara-screenshot' # Save a dump of the page when an integration test fails + gem 'factory_bot' + gem 'launchy' + gem 'rack_session_access' + gem 'rails-controller-testing' + gem 'rspec_junit_formatter' + gem 'rspec-retry' + gem 'selenium-devtools' + gem 'selenium-webdriver' + gem 'shoulda-matchers', require: false + gem 'timecop' + gem 'vcr' + gem 'webmock' +end + +group :development do + gem 'brakeman', require: false + gem 'haml-lint' + gem 'letter_opener_web' + gem 'memory_profiler' + gem 'rack-mini-profiler' + gem 'rails-erd', require: false # generates `doc/database_models.pdf` + gem 'rubocop', require: false + gem 'rubocop-performance', require: false + gem 'rubocop-rails', require: false + gem 'rubocop-rspec', require: false + gem 'scss_lint', require: false + gem 'stackprof' + gem 'web-console' +end + +group :development, :test do + gem 'graphql-schema_comparator' + gem 'mina', require: false # Deploy + gem 'pry-byebug' # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'pry-rails' + gem 'rspec-rails' + gem 'simple_xlsx_reader' + gem 'spring' # Spring speeds up development by keeping your application running in the background + gem 'spring-commands-rspec' +end diff --git a/machines/compute01/ds-fr/package/rubyEnv/Gemfile.lock b/machines/compute01/ds-fr/package/rubyEnv/Gemfile.lock new file mode 100644 index 0000000..c6eabbb --- /dev/null +++ b/machines/compute01/ds-fr/package/rubyEnv/Gemfile.lock @@ -0,0 +1,955 @@ +GEM + remote: https://rubygems.org/ + specs: + aasm (5.2.0) + concurrent-ruby (~> 1.0) + acsv (0.0.1) + actioncable (7.0.7.2) + actionpack (= 7.0.7.2) + activesupport (= 7.0.7.2) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailbox (7.0.7.2) + actionpack (= 7.0.7.2) + activejob (= 7.0.7.2) + activerecord (= 7.0.7.2) + activestorage (= 7.0.7.2) + activesupport (= 7.0.7.2) + mail (>= 2.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.0.7.2) + actionpack (= 7.0.7.2) + actionview (= 7.0.7.2) + activejob (= 7.0.7.2) + activesupport (= 7.0.7.2) + mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.0) + actionpack (7.0.7.2) + actionview (= 7.0.7.2) + activesupport (= 7.0.7.2) + rack (~> 2.0, >= 2.2.4) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (7.0.7.2) + actionpack (= 7.0.7.2) + activerecord (= 7.0.7.2) + activestorage (= 7.0.7.2) + activesupport (= 7.0.7.2) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (7.0.7.2) + activesupport (= 7.0.7.2) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + active_link_to (1.0.5) + actionpack + addressable + active_model_serializers (0.10.13) + actionpack (>= 4.1, < 7.1) + activemodel (>= 4.1, < 7.1) + case_transform (>= 0.2) + jsonapi-renderer (>= 0.1.1.beta1, < 0.3) + active_storage_validations (0.9.6) + activejob (>= 5.2.0) + activemodel (>= 5.2.0) + activestorage (>= 5.2.0) + activesupport (>= 5.2.0) + activejob (7.0.7.2) + activesupport (= 7.0.7.2) + globalid (>= 0.3.6) + activemodel (7.0.7.2) + activesupport (= 7.0.7.2) + activerecord (7.0.7.2) + activemodel (= 7.0.7.2) + activesupport (= 7.0.7.2) + activestorage (7.0.7.2) + actionpack (= 7.0.7.2) + activejob (= 7.0.7.2) + activerecord (= 7.0.7.2) + activesupport (= 7.0.7.2) + marcel (~> 1.0) + mini_mime (>= 1.1.0) + activestorage-openstack (1.6.0) + fog-openstack (>= 1.0.9) + marcel + rails (>= 5.2.2) + activesupport (7.0.7.2) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + addressable (2.8.4) + public_suffix (>= 2.0.2, < 6.0) + administrate (0.18.0) + actionpack (>= 5.0) + actionview (>= 5.0) + activerecord (>= 5.0) + jquery-rails (>= 4.0) + kaminari (>= 1.0) + sassc-rails (~> 2.1) + selectize-rails (~> 0.6) + administrate-field-enum (0.0.9) + administrate (~> 0.12) + aes_key_wrap (1.1.0) + after_party (1.11.2) + anchored (1.1.0) + ast (2.4.2) + attr_required (1.0.1) + aws-eventstream (1.2.0) + aws-partitions (1.826.0) + aws-sdk-core (3.183.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.71.0) + aws-sdk-core (~> 3, >= 3.177.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.135.0) + aws-sdk-core (~> 3, >= 3.181.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.6) + aws-sigv4 (1.6.0) + aws-eventstream (~> 1, >= 1.0.2) + axe-core-api (4.2.1) + capybara + dumb_delegator + selenium-webdriver + virtus + watir + axe-core-rspec (4.2.1) + axe-core-api + dumb_delegator + virtus + axiom-types (0.1.1) + descendants_tracker (~> 0.0.4) + ice_nine (~> 0.11.0) + thread_safe (~> 0.3, >= 0.3.1) + axlsx_styler (1.1.0) + activesupport (>= 3.1) + caxlsx (>= 2.0.2) + bcrypt (3.1.18) + better_html (1.0.16) + actionview (>= 4.0) + activesupport (>= 4.0) + ast (~> 2.0) + erubi (~> 1.4) + html_tokenizer (~> 0.0.6) + parser (>= 2.4) + smart_properties + bindata (2.4.10) + bindex (0.8.1) + bootsnap (1.9.3) + msgpack (~> 1.0) + brakeman (5.4.1) + browser (5.3.1) + builder (3.2.4) + byebug (11.1.3) + capybara (3.39.2) + addressable + matrix + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) + capybara-email (3.0.2) + capybara (>= 2.4, < 4.0) + mail + capybara-screenshot (1.0.26) + capybara (>= 1.0, < 4) + launchy + case_transform (0.2) + activesupport + caxlsx (3.1.0) + htmlentities (~> 4.3, >= 4.3.4) + marcel (~> 1.0) + nokogiri (~> 1.10, >= 1.10.4) + rubyzip (>= 1.3.0, < 3) + charlock_holmes (0.7.7) + chartkick (4.1.3) + choice (0.2.0) + chunky_png (1.4.0) + clamav-client (3.2.0) + coderay (1.1.3) + coercible (1.0.0) + descendants_tracker (~> 0.0.1) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) + content_disposition (1.0.0) + crack (0.4.5) + rexml + crass (1.0.6) + css_parser (1.9.0) + addressable + daemons (1.3.1) + date (3.3.3) + deep_cloneable (3.2.0) + activerecord (>= 3.1.0, < 8) + delayed_cron_job (0.7.4) + delayed_job (>= 4.1) + delayed_job (4.1.11) + activesupport (>= 3.0, < 8.0) + delayed_job_active_record (4.1.7) + activerecord (>= 3.0, < 8.0) + delayed_job (>= 3.0, < 5) + delayed_job_web (1.4.4) + activerecord (> 3.0.0) + delayed_job (> 2.0.3) + rack-protection (>= 1.5.5) + sinatra (>= 1.4.4) + descendants_tracker (0.0.4) + thread_safe (~> 0.3, >= 0.3.1) + devise (4.9.2) + bcrypt (~> 3.0) + orm_adapter (~> 0.1) + railties (>= 4.1.0) + responders + warden (~> 1.2.3) + devise-i18n (1.9.2) + devise (>= 4.7.1) + devise-two-factor (5.0.0) + activesupport (~> 7.0) + devise (~> 4.0) + railties (~> 7.0) + rotp (~> 6.0) + diff-lcs (1.5.0) + discard (1.2.1) + activerecord (>= 4.2, < 8) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.7.6) + dotenv-rails (2.7.6) + dotenv (= 2.7.6) + railties (>= 3.2) + dry-cli (1.0.0) + dry-core (1.0.0) + concurrent-ruby (~> 1.0) + zeitwerk (~> 2.6) + dry-inflector (0.2.0) + dry-monads (1.6.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0, < 2) + zeitwerk (~> 2.6) + dumb_delegator (1.0.0) + ecma-re-validator (0.3.0) + regexp_parser (~> 2.0) + elastic-apm (4.6.0) + concurrent-ruby (~> 1.0) + http (>= 3.0) + ruby2_keywords + erubi (1.12.0) + et-orbi (1.2.4) + tzinfo + ethon (0.15.0) + ffi (>= 1.15.0) + excon (0.102.0) + factory_bot (6.1.0) + activesupport (>= 5.0.0) + ffi (1.15.5) + ffi-compiler (1.0.1) + ffi (>= 1.0.0) + rake + flipper (0.26.0) + concurrent-ruby (< 2) + flipper-active_record (0.26.0) + activerecord (>= 4.2, < 8) + flipper (~> 0.26.0) + flipper-ui (0.26.0) + erubi (>= 1.0.0, < 2.0.0) + flipper (~> 0.26.0) + rack (>= 1.4, < 3) + rack-protection (>= 1.5.3, <= 4.0.0) + sanitize (< 7) + fog-core (2.3.0) + builder + excon (~> 0.71) + formatador (>= 0.2, < 2.0) + mime-types + fog-json (1.2.0) + fog-core + multi_json (~> 1.10) + fog-openstack (1.1.0) + fog-core (~> 2.1) + fog-json (>= 1.0) + formatador (1.1.0) + fugit (1.4.2) + et-orbi (~> 1.1, >= 1.1.8) + raabro (~> 1.4) + geo_coord (0.2.0) + geocoder (1.6.5) + globalid (1.2.1) + activesupport (>= 6.1) + gon (6.4.0) + actionpack (>= 3.0.20) + i18n (>= 0.7) + multi_json + request_store (>= 1.0) + graphql (2.0.15) + graphql-batch (0.5.1) + graphql (>= 1.10, < 3) + promise.rb (~> 0.7.2) + graphql-rails_logger (1.2.3) + actionpack (> 5.0) + activesupport (> 5.0) + railties (> 5.0) + rouge (~> 3.0) + graphql-schema_comparator (1.1.2) + bundler (>= 1.14) + graphql (>= 1.10, < 3.0) + thor (>= 0.19, < 2.0) + groupdate (5.2.2) + activesupport (>= 5) + haml (6.0.5) + temple (>= 0.8.2) + thor + tilt + haml-lint (0.999.999) + haml_lint + haml-rails (2.1.0) + actionpack (>= 5.1) + activesupport (>= 5.1) + haml (>= 4.0.6) + railties (>= 5.1) + haml_lint (0.42.0) + haml (>= 4.0, < 6.1) + parallel (~> 1.10) + rainbow + rubocop (>= 0.50.0) + sysexits (~> 1.1) + hana (1.3.7) + hashdiff (1.0.1) + hashie (4.1.0) + highline (2.0.3) + html_tokenizer (0.0.7) + htmlentities (4.3.4) + http (5.1.1) + addressable (~> 2.8) + http-cookie (~> 1.0) + http-form_data (~> 2.2) + llhttp-ffi (~> 0.4.0) + http-accept (1.7.0) + http-cookie (1.0.3) + domain_name (~> 0.5) + http-form_data (2.3.0) + http_accept_language (2.1.1) + httpclient (2.8.3) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + i18n-tasks (1.0.9) + activesupport (>= 4.0.2) + ast (>= 2.1.0) + better_html (~> 1.0) + erubi + highline (>= 2.0.0) + i18n + parser (>= 2.2.3.0) + rails-i18n + rainbow (>= 2.2.2, < 4.0) + terminal-table (>= 1.5.1) + i18n_data (0.13.0) + iban-tools (1.1.0) + ice_nine (0.11.2) + image_processing (1.12.2) + mini_magick (>= 4.9.5, < 5) + ruby-vips (>= 2.0.17, < 3) + invisible_captcha (2.0.0) + rails (>= 5.0) + jmespath (1.6.2) + jquery-rails (4.5.1) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + json (2.5.1) + json-jwt (1.13.0) + activesupport (>= 4.2) + aes_key_wrap + bindata + json_schemer (0.2.17) + ecma-re-validator (~> 0.3) + hana (~> 1.3) + regexp_parser (~> 2.0) + uri_template (~> 0.7) + jsonapi-renderer (0.2.2) + jwt (2.3.0) + kaminari (1.2.2) + activesupport (>= 4.1.0) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) + actionview + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) + activerecord + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) + launchy (2.5.0) + addressable (~> 2.7) + letter_opener (1.7.0) + launchy (~> 2.2) + letter_opener_web (1.4.0) + actionmailer (>= 3.2) + letter_opener (~> 1.0) + railties (>= 3.2) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + llhttp-ffi (0.4.0) + ffi-compiler (~> 1.0) + rake (~> 13.0) + lograge (0.11.2) + actionpack (>= 4) + activesupport (>= 4) + railties (>= 4) + request_store (~> 1.0) + logstash-event (1.2.02) + loofah (2.21.3) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.8.1) + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + mailjet (1.6.0) + activesupport (>= 3.1.0) + rack (>= 1.4.0) + rest-client (>= 2.0.0) + marcel (1.0.2) + matrix (0.4.2) + memory_profiler (1.0.0) + method_source (1.0.0) + mime-types (3.5.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2023.0808) + mina (1.2.4) + open4 (~> 1.3.4) + rake + mini_magick (4.11.0) + mini_mime (1.1.5) + mini_portile2 (2.8.4) + minitest (5.20.0) + msgpack (1.4.2) + multi_json (1.15.0) + mustermann (3.0.0) + ruby2_keywords (~> 0.0.1) + net-imap (0.3.7) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.1) + timeout + net-smtp (0.3.3) + net-protocol + netrc (0.11.0) + nio4r (2.5.9) + nokogiri (1.15.4) + mini_portile2 (~> 2.8.2) + racc (~> 1.4) + open4 (1.3.4) + openid_connect (1.3.0) + activemodel + attr_required (>= 1.0.0) + json-jwt (>= 1.5.0) + rack-oauth2 (>= 1.6.1) + swd (>= 1.0.0) + tzinfo + validate_email + validate_url + webfinger (>= 1.0.1) + orm_adapter (0.5.0) + parallel (1.23.0) + parsby (1.1.1) + parser (3.2.2.0) + ast (~> 2.4.1) + pdf-core (0.9.0) + pg (1.4.6) + phonelib (0.6.53) + prawn (2.4.0) + pdf-core (~> 0.9.0) + ttfunk (~> 1.7) + prawn-rails (1.3.0) + prawn + prawn-table + rails (>= 3.1.0) + prawn-table (0.2.2) + prawn (>= 1.3.0, < 3.0.0) + premailer (1.14.2) + addressable + css_parser (>= 1.6.0) + htmlentities (>= 4.0.0) + premailer-rails (1.11.1) + actionmailer (>= 3) + premailer (~> 1.7, >= 1.7.9) + promise.rb (0.7.4) + pry (0.14.2) + coderay (~> 1.1) + method_source (~> 1.0) + pry-byebug (3.10.1) + byebug (~> 11.0) + pry (>= 0.13, < 0.15) + pry-rails (0.3.9) + pry (>= 0.10.4) + public_suffix (5.0.1) + puma (6.3.1) + nio4r (~> 2.0) + pundit (2.2.0) + activesupport (>= 3.0.0) + raabro (1.4.0) + racc (1.7.1) + rack (2.2.8) + rack-attack (6.5.0) + rack (>= 1.0, < 3) + rack-mini-profiler (3.0.0) + rack (>= 1.2.0) + rack-oauth2 (1.19.0) + activesupport + attr_required + httpclient + json-jwt (>= 1.11.0) + rack (>= 2.1.0) + rack-protection (3.0.5) + rack + rack-proxy (0.7.6) + rack + rack-test (2.1.0) + rack (>= 1.3) + rack_session_access (0.2.0) + builder (>= 2.0.0) + rack (>= 1.0.0) + rails (7.0.7.2) + actioncable (= 7.0.7.2) + actionmailbox (= 7.0.7.2) + actionmailer (= 7.0.7.2) + actionpack (= 7.0.7.2) + actiontext (= 7.0.7.2) + actionview (= 7.0.7.2) + activejob (= 7.0.7.2) + activemodel (= 7.0.7.2) + activerecord (= 7.0.7.2) + activestorage (= 7.0.7.2) + activesupport (= 7.0.7.2) + bundler (>= 1.15.0) + railties (= 7.0.7.2) + rails-controller-testing (1.0.5) + actionpack (>= 5.0.1.rc1) + actionview (>= 5.0.1.rc1) + activesupport (>= 5.0.1.rc1) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-erd (1.6.1) + activerecord (>= 4.2) + activesupport (>= 4.2) + choice (~> 0.2.0) + ruby-graphviz (~> 1.2) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + rails-i18n (7.0.3) + i18n (>= 0.7, < 2) + railties (>= 6.0.0, < 8) + railties (7.0.7.2) + actionpack (= 7.0.7.2) + activesupport (= 7.0.7.2) + method_source + rake (>= 12.2) + thor (~> 1.0) + zeitwerk (~> 2.5) + rainbow (3.1.1) + rake (13.0.6) + rake-progressbar (0.0.5) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + redcarpet (3.6.0) + redis (5.0.6) + redis-client (>= 0.9.0) + redis-client (0.14.1) + connection_pool + regexp_parser (2.8.1) + request_store (1.5.0) + rack (>= 1.4) + responders (3.1.0) + actionpack (>= 5.2) + railties (>= 5.2) + rest-client (2.1.0) + http-accept (>= 1.7.0, < 2.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) + rexml (3.2.5) + rodf (1.1.1) + builder (>= 3.0) + dry-inflector (~> 0.1) + rubyzip (>= 1.0) + rotp (6.2.2) + rouge (3.30.0) + rqrcode (1.2.0) + chunky_png (~> 1.0) + rqrcode_core (~> 0.2) + rqrcode_core (0.2.0) + rspec-core (3.12.2) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.3) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.5) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-rails (6.0.1) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.11) + rspec-expectations (~> 3.11) + rspec-mocks (~> 3.11) + rspec-support (~> 3.11) + rspec-retry (0.6.2) + rspec-core (> 3.3) + rspec-support (3.12.0) + rspec_junit_formatter (0.4.1) + rspec-core (>= 2, < 4, != 2.12.0) + rubocop (1.50.2) + json (~> 2.3) + parallel (~> 1.10) + parser (>= 3.2.0.0) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.28.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.28.0) + parser (>= 3.2.1.0) + rubocop-capybara (2.17.1) + rubocop (~> 1.41) + rubocop-performance (1.17.1) + rubocop (>= 1.7.0, < 2.0) + rubocop-ast (>= 0.4.0) + rubocop-rails (2.19.1) + activesupport (>= 4.2.0) + rack (>= 1.1) + rubocop (>= 1.33.0, < 2.0) + rubocop-rspec (2.20.0) + rubocop (~> 1.33) + rubocop-capybara (~> 2.17) + ruby-graphviz (1.2.5) + rexml + ruby-progressbar (1.13.0) + ruby-vips (2.1.4) + ffi (~> 1.12) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + saml_idp (0.14.0) + activesupport (>= 5.2) + builder (>= 3.0) + nokogiri (>= 1.6.2) + rexml + xmlenc (>= 0.7.1) + sanitize (6.0.2) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sassc (2.4.0) + ffi (~> 1.9) + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt + scss_lint (0.59.0) + sass (~> 3.5, >= 3.5.5) + selectize-rails (0.12.6) + selenium-devtools (0.114.0) + selenium-webdriver (~> 4.2) + selenium-webdriver (4.10.0) + rexml (~> 3.2, >= 3.2.5) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) + sentry-delayed_job (5.9.0) + delayed_job (>= 4.0) + sentry-ruby (~> 5.9.0) + sentry-rails (5.9.0) + railties (>= 5.0) + sentry-ruby (~> 5.9.0) + sentry-ruby (5.9.0) + concurrent-ruby (~> 1.0, >= 1.0.2) + shoulda-matchers (4.5.1) + activesupport (>= 4.2.0) + sib-api-v3-sdk (7.4.0) + json (~> 2.1, >= 2.1.0) + typhoeus (~> 1.0, >= 1.0.1) + simple_xlsx_reader (1.0.4) + nokogiri + rubyzip + sinatra (3.0.5) + mustermann (~> 3.0) + rack (~> 2.2, >= 2.2.4) + rack-protection (= 3.0.5) + tilt (~> 2.0) + skylight (6.0.1) + activesupport (>= 5.2.0) + smart_properties (1.17.0) + spreadsheet_architect (4.1.0) + axlsx_styler (>= 1.0.0, < 2) + caxlsx (>= 2.0.2, < 4) + rodf (>= 1.0.0, < 2) + spring (4.1.1) + spring-commands-rspec (1.0.4) + spring (>= 0.9.1) + sprockets (4.2.0) + concurrent-ruby (~> 1.0) + rack (>= 2.2.4, < 4) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) + sprockets (>= 3.0.0) + stackprof (0.2.21) + strong_migrations (0.8.0) + activerecord (>= 5.2) + swd (1.3.0) + activesupport (>= 3) + attr_required (>= 0.0.5) + httpclient (>= 2.4) + sysexits (1.2.0) + temple (0.8.2) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + thor (1.2.2) + thread_safe (0.3.6) + tilt (2.0.11) + timecop (0.9.4) + timeout (0.4.0) + ttfunk (1.7.0) + turbo-rails (1.3.2) + actionpack (>= 6.0.0) + activejob (>= 6.0.0) + railties (>= 6.0.0) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + ulid-ruby (1.0.2) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + unicode-display_width (2.4.2) + uri_template (0.7.0) + validate_email (0.1.6) + activemodel (>= 3.0) + mail (>= 2.2.5) + validate_url (1.0.13) + activemodel (>= 3.0.0) + public_suffix + vcr (6.1.0) + view_component (2.82.0) + activesupport (>= 5.2.0, < 8.0) + concurrent-ruby (~> 1.0) + method_source (~> 1.0) + virtus (2.0.0) + axiom-types (~> 0.1) + coercible (~> 1.0) + descendants_tracker (~> 0.0, >= 0.0.3) + vite_rails (3.0.14) + railties (>= 5.1, < 8) + vite_ruby (~> 3.0, >= 3.2.2) + vite_ruby (3.3.1) + dry-cli (>= 0.7, < 2) + rack-proxy (~> 0.6, >= 0.6.1) + zeitwerk (~> 2.2) + warden (1.2.9) + rack (>= 2.0.9) + watir (6.19.1) + regexp_parser (>= 1.2, < 3) + selenium-webdriver (>= 3.142.7) + web-console (4.1.0) + actionview (>= 6.0.0) + activemodel (>= 6.0.0) + bindex (>= 0.4.0) + railties (>= 6.0.0) + webfinger (1.2.0) + activesupport + httpclient (>= 2.4) + webmock (3.11.2) + addressable (>= 2.3.6) + crack (>= 0.3.2) + hashdiff (>= 0.4.0, < 2.0.0) + websocket (1.2.9) + websocket-driver (0.7.6) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + xmlenc (0.8.0) + activemodel (>= 3.0.0) + activesupport (>= 3.0.0) + nokogiri (>= 1.6.0, < 2.0.0) + xmlmapper (>= 0.7.3) + xmlmapper (0.8.1) + nokogiri (~> 1.11) + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.6.11) + zip_tricks (5.6.0) + zipline (1.4.1) + actionpack (>= 6.0, < 8.0) + content_disposition (~> 1.0) + zip_tricks (>= 4.2.1, < 6.0) + zxcvbn-ruby (1.2.0) + +PLATFORMS + ruby + +DEPENDENCIES + aasm + acsv + active_link_to + active_model_serializers + active_storage_validations + activestorage-openstack + addressable + administrate + administrate-field-enum + after_party + anchored + aws-sdk-s3 + axe-core-rspec + bcrypt + bootsnap (>= 1.4.4) + brakeman + browser + capybara + capybara-email + capybara-screenshot + charlock_holmes + chartkick + chunky_png + clamav-client + daemons + deep_cloneable + delayed_cron_job + delayed_job_active_record + delayed_job_web + devise + devise-i18n + devise-two-factor + discard + dotenv-rails + dry-monads + elastic-apm + factory_bot + flipper + flipper-active_record + flipper-ui + fugit + geo_coord + geocoder + gon + graphql + graphql-batch + graphql-rails_logger + graphql-schema_comparator + groupdate + haml-lint + haml-rails + hashie + http_accept_language + i18n-tasks + i18n_data + iban-tools + image_processing + invisible_captcha + json_schemer + jwt + kaminari + launchy + letter_opener_web + listen + lograge + logstash-event + mailjet + matrix + memory_profiler + mina + mini_magick + net-imap + net-pop + net-smtp + openid_connect + parsby + pg + phonelib + prawn-rails + premailer-rails + pry-byebug + pry-rails + puma + pundit + rack-attack + rack-mini-profiler + rack_session_access + rails (~> 7.0.5) + rails-controller-testing + rails-erd + rails-i18n + rake-progressbar + redcarpet + redis + rexml + rqrcode + rspec-rails + rspec-retry + rspec_junit_formatter + rubocop + rubocop-performance + rubocop-rails + rubocop-rspec + saml_idp + sassc-rails + scss_lint + selenium-devtools + selenium-webdriver + sentry-delayed_job + sentry-rails + sentry-ruby + shoulda-matchers + sib-api-v3-sdk + simple_xlsx_reader + skylight + spreadsheet_architect + spring + spring-commands-rspec + stackprof + strong_migrations + timecop + turbo-rails + typhoeus + ulid-ruby + vcr + view_component + vite_rails + warden + web-console + webmock + zipline + zxcvbn-ruby + +BUNDLED WITH + 2.4.19 + diff --git a/machines/compute01/ds-fr/package/rubyEnv/gemset.nix b/machines/compute01/ds-fr/package/rubyEnv/gemset.nix new file mode 100644 index 0000000..a209970 --- /dev/null +++ b/machines/compute01/ds-fr/package/rubyEnv/gemset.nix @@ -0,0 +1,3338 @@ +{ + aasm = { + dependencies = ["concurrent-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05j0rdhdzc628v5nyzrazp4704hh96j5sjbn48zxyk4v3a61f4m2"; + type = "gem"; + }; + version = "5.2.0"; + }; + acsv = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "162vpm9d7acp8g8xvvfhafrpljqxkdcgrg7v9fzgr39cbpsvhvz7"; + type = "gem"; + }; + version = "0.0.1"; + }; + actioncable = { + dependencies = ["actionpack" "activesupport" "nio4r" "websocket-driver"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1i98vjh8l1xrf0ihdpvgq7mz7cfj4aww77swjlwljcgfb45868d9"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + actionmailbox = { + dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail" "net-imap" "net-pop" "net-smtp"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "093snb186qdvj1isss0k74ym7kkaq7zwfa5dwmrc0xn8kwhaxbik"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + actionmailer = { + dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "net-imap" "net-pop" "net-smtp" "rails-dom-testing"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "180ik1gkwy8lqwg0427k0hlivmz206xa453p5c221hpqk8an340f"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + actionpack = { + dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qamc5ly521wk9i1658h9jv7avmyyp92kffa1da2fn5zk0wgyhf4"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + actiontext = { + dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "globalid" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cx0zg6y0w5njl721vqx7bn0kqj5c9zbvingvl5ll20gpyzsp7nj"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + actionview = { + dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "151zxb61bb6q7g0sn34qz79k8bg02vmb8mmnsn0fr15lxw92dfhm"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + active_link_to = { + dependencies = ["actionpack" "addressable"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1firn5hw8dkqlz1c2plprrzja5f0xs606qpwx7qrsn0l7mxq8c28"; + type = "gem"; + }; + version = "1.0.5"; + }; + active_model_serializers = { + dependencies = ["actionpack" "activemodel" "case_transform" "jsonapi-renderer"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xdp7cpj3yj3wl4vj0nqq44kzjavlxi1wq3cf9zp0whkir0ym0gy"; + type = "gem"; + }; + version = "0.10.13"; + }; + active_storage_validations = { + dependencies = ["activejob" "activemodel" "activestorage" "activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1k8m8l79hfnab15znaz8hvpxz3l52kibfhdjxy94ipvil857szsp"; + type = "gem"; + }; + version = "0.9.6"; + }; + activejob = { + dependencies = ["activesupport" "globalid"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "191320166dxiq9a4lwbi1nmlq7phsfi0yr1hg2smprlwsa0vv3kd"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + activemodel = { + dependencies = ["activesupport"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1crjq1dznlbsrwd5yijxraz1591xmg4vdcwwnmrw4nh6hrwq5fj5"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + activerecord = { + dependencies = ["activemodel" "activesupport"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03vrssdqaqm41w27s21r37skdfxa41midvjy37i2zh3rnbnq8ps2"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + activestorage = { + dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1w7l2i0n84axr4da7y381k8y0wa1y3rr3k3zrkhp938ldwk7j7cg"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + activestorage-openstack = { + dependencies = ["fog-openstack" "marcel" "rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jrrp2n4p9wwnrsbf9wlghgcy74nswaiyvrxfkfli57hscj9fdl6"; + type = "gem"; + }; + version = "1.6.0"; + }; + activesupport = { + dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vlzcnyqlbchaq85phmdv73ydlc18xpvxy1cbsk191cwd29i7q32"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + addressable = { + dependencies = ["public_suffix"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15s8van7r2ad3dq6i03l3z4hqnvxcq75a3h72kxvf9an53sqma20"; + type = "gem"; + }; + version = "2.8.4"; + }; + administrate = { + dependencies = ["actionpack" "actionview" "activerecord" "jquery-rails" "kaminari" "sassc-rails" "selectize-rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00hlp3i6imkmvppby8bzpf24n486h5xiqnlglvxsfg95l5nk1jwq"; + type = "gem"; + }; + version = "0.18.0"; + }; + administrate-field-enum = { + dependencies = ["administrate"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0mgc91nwz0jl3nsm9qk5q6z8qhgvf3iqbckh61jlw2sgrr7dfiq1"; + type = "gem"; + }; + version = "0.0.9"; + }; + aes_key_wrap = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19bn0y70qm6mfj4y1m0j3s8ggh6dvxwrwrj5vfamhdrpddsz8ddr"; + type = "gem"; + }; + version = "1.1.0"; + }; + after_party = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11g8w209w1fzg9058j8gmfgsn26zp6zwaq4liwxyg021lpc8fmcl"; + type = "gem"; + }; + version = "1.11.2"; + }; + anchored = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lbmfqwlk08hfqz2a2jdby72x3m0vpdf47l4dyw37x4xiischvzl"; + type = "gem"; + }; + version = "1.1.0"; + }; + ast = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y"; + type = "gem"; + }; + version = "2.4.2"; + }; + attr_required = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1g22axmi2rhhy7w8c3x6gppsawxqavbrnxpnmphh22fk7cwi0kh2"; + type = "gem"; + }; + version = "1.0.1"; + }; + aws-eventstream = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pyis1nvnbjxk12a43xvgj2gv0mvp4cnkc1gzw0v1018r61399gz"; + type = "gem"; + }; + version = "1.2.0"; + }; + aws-partitions = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0363ia2fzm8p24kssll3wsfsh3xyf5791hm4q4ys1lkrcj5rc2hs"; + type = "gem"; + }; + version = "1.826.0"; + }; + aws-sdk-core = { + dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0y7wgscqs0xdvalbwf8vkc6zlv82hb5a3qdkxd5f3bbvyngai7xb"; + type = "gem"; + }; + version = "3.183.0"; + }; + aws-sdk-kms = { + dependencies = ["aws-sdk-core" "aws-sigv4"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zr5w2cjd895abyn7y5gifhq37bxcinssvdx2l1qmlkllbdxbwq0"; + type = "gem"; + }; + version = "1.71.0"; + }; + aws-sdk-s3 = { + dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0sqi6vy7xxw21503fis77clh26906zn08n0y67czn11dcjppsl40"; + type = "gem"; + }; + version = "1.135.0"; + }; + aws-sigv4 = { + dependencies = ["aws-eventstream"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z889c4c1w7wsjm3szg64ay5j51kjl4pdf94nlr1yks2rlanm7na"; + type = "gem"; + }; + version = "1.6.0"; + }; + axe-core-api = { + dependencies = ["capybara" "dumb_delegator" "selenium-webdriver" "virtus" "watir"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1r14qp4wima3dldfk543krd53n6i86jhymq39vq002yq23d8i7n4"; + type = "gem"; + }; + version = "4.2.1"; + }; + axe-core-rspec = { + dependencies = ["axe-core-api" "dumb_delegator" "virtus"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "07fibb6fw201wba0gh88bykmrp4shpn894bjsbrk847m3s99xjdz"; + type = "gem"; + }; + version = "4.2.1"; + }; + axiom-types = { + dependencies = ["descendants_tracker" "ice_nine" "thread_safe"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10q3k04pll041mkgy0m5fn2b1lazm6ly1drdbcczl5p57lzi3zy1"; + type = "gem"; + }; + version = "0.1.1"; + }; + axlsx_styler = { + dependencies = ["activesupport" "caxlsx"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1g486p337qv6c771x8kz18siy9zbrgjnq5gyz2zsmnanxh7kpmxg"; + type = "gem"; + }; + version = "1.1.0"; + }; + bcrypt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "048z3fvcknqx7ikkhrcrykxlqmf9bzc7l0y5h1cnvrc9n2qf0k8m"; + type = "gem"; + }; + version = "3.1.18"; + }; + better_html = { + dependencies = ["actionview" "activesupport" "ast" "erubi" "html_tokenizer" "parser" "smart_properties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1sssv94gg7bnxiqn5pbbpf8rdnmw3iyj2qwn2pbgxxs8xmmq158b"; + type = "gem"; + }; + version = "1.0.16"; + }; + bindata = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06lqi4svq5qls9f7nnvd2zmjdqmi2sf82sq78ci5d78fq0z5x2vr"; + type = "gem"; + }; + version = "2.4.10"; + }; + bindex = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0zmirr3m02p52bzq4xgksq4pn8j641rx5d4czk68pv9rqnfwq7kv"; + type = "gem"; + }; + version = "0.8.1"; + }; + bootsnap = { + dependencies = ["msgpack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18prmylz53gsw651f0sibb2mvdxgd2zzdzh6a9a1idpqhyxcnbg7"; + type = "gem"; + }; + version = "1.9.3"; + }; + brakeman = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wzvxpabnjwwjgr9s13965dbdgl3qfvwjbmhimh83p81bm5lsrnw"; + type = "gem"; + }; + version = "5.4.1"; + }; + browser = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0g4bcpax07kqqr9cp7cjc7i0pcij4nqpn1rdsg2wdwhzf00m6x32"; + type = "gem"; + }; + version = "5.3.1"; + }; + builder = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr"; + type = "gem"; + }; + version = "3.2.4"; + }; + byebug = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nx3yjf4xzdgb8jkmk2344081gqr22pgjqnmjg2q64mj5d6r9194"; + type = "gem"; + }; + version = "11.1.3"; + }; + capybara = { + dependencies = ["addressable" "matrix" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "114qm5f5vhwaaw9rj1h2lcamh46zl13v1m18jiw68zl961gwmw6n"; + type = "gem"; + }; + version = "3.39.2"; + }; + capybara-email = { + dependencies = ["capybara" "mail"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0vv9c3vldky1rfy3x20nz4a8ic0fg66x2223wbmv35n02ndxsrdb"; + type = "gem"; + }; + version = "3.0.2"; + }; + capybara-screenshot = { + dependencies = ["capybara" "launchy"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xqc7hdiw1ql42mklpfvqd2pyfsxmy55cpx0h9y0jlkpl1q96sw1"; + type = "gem"; + }; + version = "1.0.26"; + }; + case_transform = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0fzyws6spn5arqf6q604dh9mrj84a36k5hsc8z7jgcpfvhc49bg2"; + type = "gem"; + }; + version = "0.2"; + }; + caxlsx = { + dependencies = ["htmlentities" "marcel" "nokogiri" "rubyzip"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lx0dh0m1wnwqyf4ixvxkvdgim4rlmh5i5if624hj4z6mwlhpn70"; + type = "gem"; + }; + version = "3.1.0"; + }; + charlock_holmes = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hybw8jw9ryvz5zrki3gc9r88jqy373m6v46ynxsdzv1ysiyr40p"; + type = "gem"; + }; + version = "0.7.7"; + }; + chartkick = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qjnm98ki484xy8xqz7xwxvja3j01ybl7v30viz1wff48w5y51gh"; + type = "gem"; + }; + version = "4.1.3"; + }; + choice = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0x6972zngnsvr3nd3iiy25d6ipi0cr21c1jxm0w1p4nlvzvig5m1"; + type = "gem"; + }; + version = "0.2.0"; + }; + chunky_png = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1znw5x86hmm9vfhidwdsijz8m38pqgmv98l9ryilvky0aldv7mc9"; + type = "gem"; + }; + version = "1.4.0"; + }; + clamav-client = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10mdaz695057kxpm3j802cagf1isxl57zzismvkzr5kajsvqdlim"; + type = "gem"; + }; + version = "3.2.0"; + }; + coderay = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jvxqxzply1lwp7ysn94zjhh57vc14mcshw1ygw14ib8lhc00lyw"; + type = "gem"; + }; + version = "1.1.3"; + }; + coercible = { + dependencies = ["descendants_tracker"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1p5azydlsz0nkxmcq0i1gzmcfq02lgxc4as7wmf47j1c6ljav0ah"; + type = "gem"; + }; + version = "1.0.0"; + }; + concurrent-ruby = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0krcwb6mn0iklajwngwsg850nk8k9b35dhmc2qkbdqvmifdi2y9q"; + type = "gem"; + }; + version = "1.2.2"; + }; + connection_pool = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x32mcpm2cl5492kd6lbjbaf17qsssmpx9kdyr7z1wcif2cwyh0g"; + type = "gem"; + }; + version = "2.4.1"; + }; + content_disposition = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05m5ipc81fj2pphlz1ms1yxq80ymilfjhprz790lafjlq6lks5da"; + type = "gem"; + }; + version = "1.0.0"; + }; + crack = { + dependencies = ["rexml"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r"; + type = "gem"; + }; + version = "0.4.5"; + }; + crass = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw"; + type = "gem"; + }; + version = "1.0.6"; + }; + css_parser = { + dependencies = ["addressable"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xs4ind9xd099rb52b73pch8ha143dl8bhivqsbba4wrvxpbx751"; + type = "gem"; + }; + version = "1.9.0"; + }; + daemons = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l5gai3vd4g7aqff0k1mp41j9zcsvm2rbwmqn115a325k9r7pf4w"; + type = "gem"; + }; + version = "1.3.1"; + }; + date = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03skfikihpx37rc27vr3hwrb057gxnmdzxhmzd4bf4jpkl0r55w1"; + type = "gem"; + }; + version = "3.3.3"; + }; + deep_cloneable = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dychjkr6fbdnw6ynsrcjj6anghhcw3ghrx5073pc6y0wc7v8zn8"; + type = "gem"; + }; + version = "3.2.0"; + }; + delayed_cron_job = { + dependencies = ["delayed_job"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1qsf7csnhyk787yx88ilsqris3h0gga3g6ri31hccdfbdab1f33a"; + type = "gem"; + }; + version = "0.7.4"; + }; + delayed_job = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0s2xg72ljg4cwmr05zi67vcyz8zib46gvvf7rmrdhsyq387m2qcq"; + type = "gem"; + }; + version = "4.1.11"; + }; + delayed_job_active_record = { + dependencies = ["activerecord" "delayed_job"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wh1146hg0b85zv336dn00jx9mzw5ma0maj67is7bvz5l35hd6yk"; + type = "gem"; + }; + version = "4.1.7"; + }; + delayed_job_web = { + dependencies = ["activerecord" "delayed_job" "rack-protection" "sinatra"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01kbdbmzlbr5z0vn32llbr6fh9srk7884b1zsjif2v5x1qs9d13k"; + type = "gem"; + }; + version = "1.4.4"; + }; + descendants_tracker = { + dependencies = ["thread_safe"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15q8g3fcqyb41qixn6cky0k3p86291y7xsh1jfd851dvrza1vi79"; + type = "gem"; + }; + version = "0.0.4"; + }; + devise = { + dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0vpd7d61d4pfmyb2plnnv82wmczzlhw4k4gjhd2fv4r6vq8ilqqi"; + type = "gem"; + }; + version = "4.9.2"; + }; + devise-i18n = { + dependencies = ["devise"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cq4l25b17x0yc71kb3y77rc0idnpqcc30hsnl4i07h2s543arvg"; + type = "gem"; + }; + version = "1.9.2"; + }; + devise-two-factor = { + dependencies = ["activesupport" "devise" "railties" "rotp"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hh0yc85ixnan90hibz3nba6pamhscxfr1zaymxgv3vw5icv50ya"; + type = "gem"; + }; + version = "5.0.0"; + }; + diff-lcs = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rwvjahnp7cpmracd8x732rjgnilqv2sx7d1gfrysslc3h039fa9"; + type = "gem"; + }; + version = "1.5.0"; + }; + discard = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xavjhccyyzn9z6fz3034vgvzprc983mbrq6n9sc0drfw7m3vrip"; + type = "gem"; + }; + version = "1.2.1"; + }; + domain_name = { + dependencies = ["unf"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lcqjsmixjp52bnlgzh4lg9ppsk52x9hpwdjd53k8jnbah2602h0"; + type = "gem"; + }; + version = "0.5.20190701"; + }; + dotenv = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0iym172c5337sm1x2ykc2i3f961vj3wdclbyg1x6sxs3irgfsl94"; + type = "gem"; + }; + version = "2.7.6"; + }; + dotenv-rails = { + dependencies = ["dotenv" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1my2jdmgmpf32rfxffkb9cyxh7ayis4q5ygpwjqj4vpp25y3a70c"; + type = "gem"; + }; + version = "2.7.6"; + }; + dry-cli = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1w39jms4bsggxvl23cxanhccv1ngb6nqxsqhi784v5bjz1lx3si8"; + type = "gem"; + }; + version = "1.0.0"; + }; + dry-core = { + dependencies = ["concurrent-ruby" "zeitwerk"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01gks2hrp7nl3pzb487azvd25dlbrc40d5cpk4n0szwnf2c0k4ks"; + type = "gem"; + }; + version = "1.0.0"; + }; + dry-inflector = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17mkdwglqsd9fg272y3zms7rixjgkb1km1xcb88ir5lxvk1jkky7"; + type = "gem"; + }; + version = "0.2.0"; + }; + dry-monads = { + dependencies = ["concurrent-ruby" "dry-core" "zeitwerk"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06sh48d13gyb2lascfd5g2pyf1qxzinydgb0ir81kbwga3zqj0rv"; + type = "gem"; + }; + version = "1.6.0"; + }; + dumb_delegator = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "151fdn7y0gqs7f6y3y7rn3frv0z359qrw9hb4s7avn6j2qc42ppz"; + type = "gem"; + }; + version = "1.0.0"; + }; + ecma-re-validator = { + dependencies = ["regexp_parser"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1mz0nsl2093jd94nygw8qs13rwfwl1ax76xz3ypinr5hqbc5pab6"; + type = "gem"; + }; + version = "0.3.0"; + }; + elastic-apm = { + dependencies = ["concurrent-ruby" "http" "ruby2_keywords"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0j56r0vykn3hlixziav7xwg981l5algi9xsngp4kbgir8wkjgm05"; + type = "gem"; + }; + version = "4.6.0"; + }; + erubi = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08s75vs9cxlc4r1q2bjg4br8g9wc5lc5x5vl0vv4zq5ivxsdpgi7"; + type = "gem"; + }; + version = "1.12.0"; + }; + et-orbi = { + dependencies = ["tzinfo"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xr8i8ql4xzx17d12590i3j299hj6vc0ja2j29dy12i5nlchxrvp"; + type = "gem"; + }; + version = "1.2.4"; + }; + ethon = { + dependencies = ["ffi"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kd7c61f28f810fgxg480j7457nlvqarza9c2ra0zhav0dd80288"; + type = "gem"; + }; + version = "0.15.0"; + }; + excon = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0mbkyyadz9vw7mzixi9dks6i6iw033yn2hzwfvnfdvgqq6ywqs4g"; + type = "gem"; + }; + version = "0.102.0"; + }; + factory_bot = { + dependencies = ["activesupport"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11ij9s4hasy963qjqbrrf0m8lm9m9pxkh2vf4wrnafa6gw6r9qk8"; + type = "gem"; + }; + version = "6.1.0"; + }; + ffi = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1862ydmclzy1a0cjbvm8dz7847d9rch495ib0zb64y84d3xd4bkg"; + type = "gem"; + }; + version = "1.15.5"; + }; + ffi-compiler = { + dependencies = ["ffi" "rake"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0c2caqm9wqnbidcb8dj4wd3s902z15qmgxplwyfyqbwa0ydki7q1"; + type = "gem"; + }; + version = "1.0.1"; + }; + flipper = { + dependencies = ["concurrent-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1myzrakl70fql0kpaqz0rnb584mfghjc4kci4cafgrl6hs4qc8gs"; + type = "gem"; + }; + version = "0.26.0"; + }; + flipper-active_record = { + dependencies = ["activerecord" "flipper"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0590i5q5w0c4m7f3c1p9rc52q75912wav2p3pb182zs19l0b0njs"; + type = "gem"; + }; + version = "0.26.0"; + }; + flipper-ui = { + dependencies = ["erubi" "flipper" "rack" "rack-protection" "sanitize"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03znj5kd3a9y3a8q58z6vfzppvf7wn06i3sv3wab3fdzs3n6kplw"; + type = "gem"; + }; + version = "0.26.0"; + }; + fog-core = { + dependencies = ["builder" "excon" "formatador" "mime-types"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06m6hxq8vspx9h9bgc2s19m56jzasvl45vblrfv1q5h1qg1k6amw"; + type = "gem"; + }; + version = "2.3.0"; + }; + fog-json = { + dependencies = ["fog-core" "multi_json"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx"; + type = "gem"; + }; + version = "1.2.0"; + }; + fog-openstack = { + dependencies = ["fog-core" "fog-json"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xh9qs00l1d7rxsr9qjlba8dprh9km8ya06y59qf17vncihl1xa7"; + type = "gem"; + }; + version = "1.1.0"; + }; + formatador = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l06bv4avphbdmr1y4g0rqlczr38k6r65b3zghrbj2ynyhm3xqjl"; + type = "gem"; + }; + version = "1.1.0"; + }; + fugit = { + dependencies = ["et-orbi" "raabro"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0sz6yx80zgj8yj7w3c95yyqg743hqp0szxlqpmpnbirmmfdb2r9y"; + type = "gem"; + }; + version = "1.4.2"; + }; + geo_coord = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1s6p0zh39g8x3rgkkf5k02ypspnghmz3v3qkp56zmslxg72jskmf"; + type = "gem"; + }; + version = "0.2.0"; + }; + geocoder = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1381dlwx937hsvc71xqbxkp14b5vwnzrsh7jpvnn3a8naqcdif1j"; + type = "gem"; + }; + version = "1.6.5"; + }; + globalid = { + dependencies = ["activesupport"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1sbw6b66r7cwdx3jhs46s4lr991969hvigkjpbdl7y3i31qpdgvh"; + type = "gem"; + }; + version = "1.2.1"; + }; + gon = { + dependencies = ["actionpack" "i18n" "multi_json" "request_store"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1w6ji15jrl4p6q0gxy5mmqspvzbmgkqj1d3xmbqr0a1rb7b1i9p3"; + type = "gem"; + }; + version = "6.4.0"; + }; + graphql = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0w571rwcmr07jk3bcfrl0cdxdldmi7li53s4sirj976wbrbrrqfs"; + type = "gem"; + }; + version = "2.0.15"; + }; + graphql-batch = { + dependencies = ["graphql" "promise.rb"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1znnjl7ykhp27p48by97hk83s2pa9fvn6zmx8aywmhw9pkbw8jq9"; + type = "gem"; + }; + version = "0.5.1"; + }; + graphql-rails_logger = { + dependencies = ["actionpack" "activesupport" "railties" "rouge"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z792847jyaq9q0lai5r58q5kgiybbmsc0cwv024qfzmqzf03m06"; + type = "gem"; + }; + version = "1.2.3"; + }; + graphql-schema_comparator = { + dependencies = ["graphql" "thor"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hf03rqpzjycz623glp9p3w2nxabiwmqy6pjzkwsjqq6w91wsr9p"; + type = "gem"; + }; + version = "1.1.2"; + }; + groupdate = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0zfa34vczk21c2sz6xq8n0y7c7dn9628kj6yicyazlx3rg5r18wg"; + type = "gem"; + }; + version = "5.2.2"; + }; + haml = { + dependencies = ["temple" "thor" "tilt"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1w6lrad138dz3r4rva525r09n2wk54zc3zzanam067n6rkyi4j23"; + type = "gem"; + }; + version = "6.0.5"; + }; + haml-lint = { + dependencies = ["haml_lint"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15g3g47bxvdjx6z6awl6wqqw1ddvf5vzjb09x8hb43dvdp8ba7sv"; + type = "gem"; + }; + version = "0.999.999"; + }; + haml-rails = { + dependencies = ["actionpack" "activesupport" "haml" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1sjrdwc4azzfpsp2xk0365z031482gcrs0c54d5wx0igkqca0fr7"; + type = "gem"; + }; + version = "2.1.0"; + }; + haml_lint = { + dependencies = ["haml" "parallel" "rainbow" "rubocop" "sysexits"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "110fshcqm9dsl5vmrbmdcyr5nxan7svh48c7hhimz6miybigp8jr"; + type = "gem"; + }; + version = "0.42.0"; + }; + hana = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03cvrv2wl25j9n4n509hjvqnmwa60k92j741b64a1zjisr1dn9al"; + type = "gem"; + }; + version = "1.3.7"; + }; + hashdiff = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c"; + type = "gem"; + }; + version = "1.0.1"; + }; + hashie = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02bsx12ihl78x0vdm37byp78jjw2ff6035y7rrmbd90qxjwxr43q"; + type = "gem"; + }; + version = "4.1.0"; + }; + highline = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d"; + type = "gem"; + }; + version = "2.0.3"; + }; + html_tokenizer = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dq6685sdzdn53mkzags6mvx3l0afcx6xma664zij6y3dxj2a7p8"; + type = "gem"; + }; + version = "0.0.7"; + }; + htmlentities = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nkklqsn8ir8wizzlakncfv42i32wc0w9hxp00hvdlgjr7376nhj"; + type = "gem"; + }; + version = "4.3.4"; + }; + http = { + dependencies = ["addressable" "http-cookie" "http-form_data" "llhttp-ffi"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bzb8p31kzv6q5p4z5xq88mnqk414rrw0y5rkhpnvpl29x5c3bpw"; + type = "gem"; + }; + version = "5.1.1"; + }; + http-accept = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09m1facypsdjynfwrcv19xcb1mqg8z6kk31g8r33pfxzh838c9n6"; + type = "gem"; + }; + version = "1.7.0"; + }; + http-cookie = { + dependencies = ["domain_name"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g"; + type = "gem"; + }; + version = "1.0.3"; + }; + http-form_data = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wx591jdhy84901pklh1n9sgh74gnvq1qyqxwchni1yrc49ynknc"; + type = "gem"; + }; + version = "2.3.0"; + }; + http_accept_language = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0d0nlfz9vm4jr1l6q0chx4rp2hrnrfbx3gadc1dz930lbbaz0hq0"; + type = "gem"; + }; + version = "2.1.1"; + }; + httpclient = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19mxmvghp7ki3klsxwrlwr431li7hm1lczhhj8z4qihl2acy8l99"; + type = "gem"; + }; + version = "2.8.3"; + }; + i18n = { + dependencies = ["concurrent-ruby"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qaamqsh5f3szhcakkak8ikxlzxqnv49n2p7504hcz2l0f4nj0wx"; + type = "gem"; + }; + version = "1.14.1"; + }; + i18n-tasks = { + dependencies = ["activesupport" "ast" "better_html" "erubi" "highline" "i18n" "parser" "rails-i18n" "rainbow" "terminal-table"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hiblss98hmybs82xsaavhz1cwlhhx92jzlx8ypkriylxhhwmigk"; + type = "gem"; + }; + version = "1.0.9"; + }; + i18n_data = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jzrb3z8i0ny3wkh09x1xs04ay0q8lk1prvkbpwzr99jw9a2h8sc"; + type = "gem"; + }; + version = "0.13.0"; + }; + iban-tools = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lz6idka39qbh1vv8sp8kd5rzdmxi5452lx2ank63958jiww52by"; + type = "gem"; + }; + version = "1.1.0"; + }; + ice_nine = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nv35qg1rps9fsis28hz2cq2fx1i96795f91q4nmkm934xynll2x"; + type = "gem"; + }; + version = "0.11.2"; + }; + image_processing = { + dependencies = ["mini_magick" "ruby-vips"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1f32dzj77p9mfp4q95930vfkp80psf88phjc46jhf9ncl72ykffk"; + type = "gem"; + }; + version = "1.12.2"; + }; + invisible_captcha = { + dependencies = ["rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hn06njrwbxhxs2myr04fq3spqn38b8wm3irvkll91qv3p5yv0d3"; + type = "gem"; + }; + version = "2.0.0"; + }; + jmespath = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cdw9vw2qly7q7r41s7phnac264rbsdqgj4l0h4nqgbjb157g393"; + type = "gem"; + }; + version = "1.6.2"; + }; + jquery-rails = { + dependencies = ["rails-dom-testing" "railties" "thor"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rxfy6mk1yh8yjkk7gd1908f85dkc60xnfplwz7mi09f6j3f812p"; + type = "gem"; + }; + version = "4.5.1"; + }; + json = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lrirj0gw420kw71bjjlqkqhqbrplla61gbv1jzgsz6bv90qr3ci"; + type = "gem"; + }; + version = "2.5.1"; + }; + json-jwt = { + dependencies = ["activesupport" "aes_key_wrap" "bindata"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nzbk1mrbf9mnvjpn3bxy8a85rjf94qmfdnvk78mjzk8pa0fvgdr"; + type = "gem"; + }; + version = "1.13.0"; + }; + json_schemer = { + dependencies = ["ecma-re-validator" "hana" "regexp_parser" "uri_template"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03wfpkckl4i5dgywa1cxd71ph6hm15x6pnqkja196zdkfb647znd"; + type = "gem"; + }; + version = "0.2.17"; + }; + jsonapi-renderer = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ys4drd0k9rw5ixf8n8fx8v0pjh792w4myh0cpdspd317l1lpi5m"; + type = "gem"; + }; + version = "0.2.2"; + }; + jwt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bg8pjx0mpvl10k6d8a6gc8dzlv2z5jkqcjbjcirnk032iriq838"; + type = "gem"; + }; + version = "2.3.0"; + }; + kaminari = { + dependencies = ["activesupport" "kaminari-actionview" "kaminari-activerecord" "kaminari-core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gia8irryvfhcr6bsr64kpisbgdbqjsqfgrk12a11incmpwny1y4"; + type = "gem"; + }; + version = "1.2.2"; + }; + kaminari-actionview = { + dependencies = ["actionview" "kaminari-core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02f9ghl3a9b5q7l079d3yzmqjwkr4jigi7sldbps992rigygcc0k"; + type = "gem"; + }; + version = "1.2.2"; + }; + kaminari-activerecord = { + dependencies = ["activerecord" "kaminari-core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0c148z97s1cqivzbwrak149z7kl1rdmj7dxk6rpkasimmdxsdlqd"; + type = "gem"; + }; + version = "1.2.2"; + }; + kaminari-core = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zw3pg6kj39y7jxakbx7if59pl28lhk98fx71ks5lr3hfgn6zliv"; + type = "gem"; + }; + version = "1.2.2"; + }; + launchy = { + dependencies = ["addressable"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xdyvr5j0gjj7b10kgvh8ylxnwk3wx19my42wqn9h82r4p246hlm"; + type = "gem"; + }; + version = "2.5.0"; + }; + letter_opener = { + dependencies = ["launchy"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09a7kgsmr10a0hrc9bwxglgqvppjxij9w8bxx91mnvh0ivaw0nq9"; + type = "gem"; + }; + version = "1.7.0"; + }; + letter_opener_web = { + dependencies = ["actionmailer" "letter_opener" "railties"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pianlrbf9n7jrqxpyxgsfk1j1d312d57d6gq7yxni6ax2q0293q"; + type = "gem"; + }; + version = "1.4.0"; + }; + listen = { + dependencies = ["rb-fsevent" "rb-inotify"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13rgkfar8pp31z1aamxf5y7cfq88wv6rxxcwy7cmm177qq508ycn"; + type = "gem"; + }; + version = "3.8.0"; + }; + llhttp-ffi = { + dependencies = ["ffi-compiler" "rake"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00dh6zmqdj59rhcya0l4b9aaxq6n8xizfbil93k0g06gndyk5xz5"; + type = "gem"; + }; + version = "0.4.0"; + }; + lograge = { + dependencies = ["actionpack" "activesupport" "railties" "request_store"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vrjm4yqn5l6q5gsl72fmk95fl6j9z1a05gzbrwmsm3gp1a1bgac"; + type = "gem"; + }; + version = "0.11.2"; + }; + logstash-event = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bk7fhhryjxp1klr3hq6i6srrc21wl4p980bysjp0w66z9hdr9w9"; + type = "gem"; + }; + version = "1.2.02"; + }; + loofah = { + dependencies = ["crass" "nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1p744kjpb5zk2ihklbykzii77alycjc04vpnm2ch2f3cp65imlj3"; + type = "gem"; + }; + version = "2.21.3"; + }; + mail = { + dependencies = ["mini_mime" "net-imap" "net-pop" "net-smtp"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bf9pysw1jfgynv692hhaycfxa8ckay1gjw5hz3madrbrynryfzc"; + type = "gem"; + }; + version = "2.8.1"; + }; + mailjet = { + dependencies = ["activesupport" "rack" "rest-client"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kbxxxhb3as0w3k2hkiv7zaygvr68r5y35zhbi88380g2nnqcv4v"; + type = "gem"; + }; + version = "1.6.0"; + }; + marcel = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kky3yiwagsk8gfbzn3mvl2fxlh3b39v6nawzm4wpjs6xxvvc4x0"; + type = "gem"; + }; + version = "1.0.2"; + }; + matrix = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1h2cgkpzkh3dd0flnnwfq6f3nl2b1zff9lvqz8xs853ssv5kq23i"; + type = "gem"; + }; + version = "0.4.2"; + }; + memory_profiler = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0s8qaf19yr4lhvdxk3cy3ifc47cgxdz2jybg6hzxsy9gh88c1f7v"; + type = "gem"; + }; + version = "1.0.0"; + }; + method_source = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp"; + type = "gem"; + }; + version = "1.0.0"; + }; + mime-types = { + dependencies = ["mime-types-data"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q8d881k1b3rbsfcdi3fx0b5vpdr5wcrhn88r2d9j7zjdkxp5mw5"; + type = "gem"; + }; + version = "3.5.1"; + }; + mime-types-data = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17zdim7kzrh5j8c97vjqp4xp78wbyz7smdp4hi5iyzk0s9imdn5a"; + type = "gem"; + }; + version = "3.2023.0808"; + }; + mina = { + dependencies = ["open4" "rake"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0h7cy17qd1z13irnlifpdqis9hnsjijbkj0qryprlmiccfshqxk5"; + type = "gem"; + }; + version = "1.2.4"; + }; + mini_magick = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1aj604x11d9pksbljh0l38f70b558rhdgji1s9i763hiagvvx2hs"; + type = "gem"; + }; + version = "4.11.0"; + }; + mini_mime = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vycif7pjzkr29mfk4dlqv3disc5dn0va04lkwajlpr1wkibg0c6"; + type = "gem"; + }; + version = "1.1.5"; + }; + mini_portile2 = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02mj8mpd6ck5gpcnsimx5brzggw5h5mmmpq2djdypfq16wcw82qq"; + type = "gem"; + }; + version = "2.8.4"; + }; + minitest = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bkmfi9mb49m0fkdhl2g38i3xxa02d411gg0m8x0gvbwfmmg5ym3"; + type = "gem"; + }; + version = "5.20.0"; + }; + msgpack = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6"; + type = "gem"; + }; + version = "1.4.2"; + }; + multi_json = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z"; + type = "gem"; + }; + version = "1.15.0"; + }; + mustermann = { + dependencies = ["ruby2_keywords"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rwbq20s2gdh8dljjsgj5s6wqqfmnbclhvv2c2608brv7jm6jdbd"; + type = "gem"; + }; + version = "3.0.0"; + }; + net-imap = { + dependencies = ["date" "net-protocol"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lf7wqg7czhaj51qsnmn28j7jmcxhkh3m28rl1cjrqsgjxhwj7r3"; + type = "gem"; + }; + version = "0.3.7"; + }; + net-pop = { + dependencies = ["net-protocol"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wyz41jd4zpjn0v1xsf9j778qx1vfrl24yc20cpmph8k42c4x2w4"; + type = "gem"; + }; + version = "0.1.2"; + }; + net-protocol = { + dependencies = ["timeout"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dxckrlw4q1lcn3qg4mimmjazmg9bma5gllv72f8js3p36fb3b91"; + type = "gem"; + }; + version = "0.2.1"; + }; + net-smtp = { + dependencies = ["net-protocol"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1c6md06hm5bf6rv53sk54dl2vg038pg8kglwv3rayx0vk2mdql9x"; + type = "gem"; + }; + version = "0.3.3"; + }; + netrc = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gzfmcywp1da8nzfqsql2zqi648mfnx6qwkig3cv36n9m0yy676y"; + type = "gem"; + }; + version = "0.11.0"; + }; + nio4r = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0w9978zwjf1qhy3amkivab0f9syz6a7k0xgydjidaf7xc831d78f"; + type = "gem"; + }; + version = "2.5.9"; + }; + nokogiri = { + dependencies = ["mini_portile2" "racc"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k9w2z0953mnjrsji74cshqqp08q7m1r6zhadw1w0g34xzjh3a74"; + type = "gem"; + }; + version = "1.15.4"; + }; + open4 = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cgls3f9dlrpil846q0w7h66vsc33jqn84nql4gcqkk221rh7px1"; + type = "gem"; + }; + version = "1.3.4"; + }; + openid_connect = { + dependencies = ["activemodel" "attr_required" "json-jwt" "rack-oauth2" "swd" "tzinfo" "validate_email" "validate_url" "webfinger"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0w474bz3s1hqhilvrddr33l2nkyikypaczp3808w0345jr88b5m7"; + type = "gem"; + }; + version = "1.3.0"; + }; + orm_adapter = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda"; + type = "gem"; + }; + version = "0.5.0"; + }; + parallel = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jcc512l38c0c163ni3jgskvq1vc3mr8ly5pvjijzwvfml9lf597"; + type = "gem"; + }; + version = "1.23.0"; + }; + parsby = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1swwcyzc1h1fr344ad0xlyad0470znfi617mk8sv98xgwq24z5qc"; + type = "gem"; + }; + version = "1.1.1"; + }; + parser = { + dependencies = ["ast"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0s5afi89p76k8vpwiqvh343pm5l23ijqlpszhz65afym3zpkxhzx"; + type = "gem"; + }; + version = "3.2.2.0"; + }; + pdf-core = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fz0yj4zrlii2j08kaw11j769s373ayz8jrdhxwwjzmm28pqndjg"; + type = "gem"; + }; + version = "0.9.0"; + }; + pg = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "07m6lxljabw9kyww5k5lgsxsznsm1v5l14r1la09gqka9b5kv3yr"; + type = "gem"; + }; + version = "1.4.6"; + }; + phonelib = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10grpnng2bkf3szmadkn2mkq95rk5a0jl72x1qq4bxsr6b6liyzz"; + type = "gem"; + }; + version = "0.6.53"; + }; + prawn = { + dependencies = ["pdf-core" "ttfunk"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1g9avv2rprsjisdk137s9ljr05r7ajhm78hxa1vjsv0jyx22f1l2"; + type = "gem"; + }; + version = "2.4.0"; + }; + prawn-rails = { + dependencies = ["prawn" "prawn-table" "rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wxjs8wmkfd2zc864irpkddjapb1a9ncsiybmx4lx8dxbzxhsycm"; + type = "gem"; + }; + version = "1.3.0"; + }; + prawn-table = { + dependencies = ["prawn"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nxd6qmxqwl850icp18wjh5k0s3amxcajdrkjyzpfgq0kvilcv9k"; + type = "gem"; + }; + version = "0.2.2"; + }; + premailer = { + dependencies = ["addressable" "css_parser" "htmlentities"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1f0zz3vwv1kyr43chvrpvhb8wm9qgcaz8ckc1lj2jxfp6xsss971"; + type = "gem"; + }; + version = "1.14.2"; + }; + premailer-rails = { + dependencies = ["actionmailer" "premailer"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q23clzqgzxcg1jld7hn5jy2yqxvana3iw66vmjgzz7y4ylf97b6"; + type = "gem"; + }; + version = "1.11.1"; + }; + "promise.rb" = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0a819sikcqvhi8hck1y10d1nv2qkjvmmm553626fmrh51h2i089d"; + type = "gem"; + }; + version = "0.7.4"; + }; + pry = { + dependencies = ["coderay" "method_source"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k9kqkd9nps1w1r1rb7wjr31hqzkka2bhi8b518x78dcxppm9zn4"; + type = "gem"; + }; + version = "0.14.2"; + }; + pry-byebug = { + dependencies = ["byebug" "pry"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1y41al94ks07166qbp2200yzyr5y60hm7xaiw4lxpgsm4b1pbyf8"; + type = "gem"; + }; + version = "3.10.1"; + }; + pry-rails = { + dependencies = ["pry"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cf4ii53w2hdh7fn8vhqpzkymmchjbwij4l3m7s6fsxvb9bn51j6"; + type = "gem"; + }; + version = "0.3.9"; + }; + public_suffix = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hz0bx2qs2pwb0bwazzsah03ilpf3aai8b7lk7s35jsfzwbkjq35"; + type = "gem"; + }; + version = "5.0.1"; + }; + puma = { + dependencies = ["nio4r"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x4dwx2shx0p7lsms97r85r7ji7zv57bjy3i1kmcpxc8bxvrr67c"; + type = "gem"; + }; + version = "6.3.1"; + }; + pundit = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17z2f7w3syh3c04c8m1v9pvb9pfpymk8b5plszr5l24hx374xvsd"; + type = "gem"; + }; + version = "2.2.0"; + }; + raabro = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10m8bln9d00dwzjil1k42i5r7l82x25ysbi45fwyv4932zsrzynl"; + type = "gem"; + }; + version = "1.4.0"; + }; + racc = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11v3l46mwnlzlc371wr3x6yylpgafgwdf0q7hc7c1lzx6r414r5g"; + type = "gem"; + }; + version = "1.7.1"; + }; + rack = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15rdwbyk71c9nxvd527bvb8jxkcys8r3dj3vqra5b3sa63qs30vv"; + type = "gem"; + }; + version = "2.2.8"; + }; + rack-attack = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kiixzpazjqgljjy1ngfz1by5vz6kjx0d4mf1fq7b3ywpfjf80lq"; + type = "gem"; + }; + version = "6.5.0"; + }; + rack-mini-profiler = { + dependencies = ["rack"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "121fqk18x1bd52c2bkz8wkvv9nkgpqphj5aycnb7lkf67jkwic0h"; + type = "gem"; + }; + version = "3.0.0"; + }; + rack-oauth2 = { + dependencies = ["activesupport" "attr_required" "httpclient" "json-jwt" "rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gxxr209r8h3nxhc9h731khv6yswiv9hc6q2pg672v530xmknznw"; + type = "gem"; + }; + version = "1.19.0"; + }; + rack-protection = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1a12m1mv8dc0g90fs1myvis8vsgr427k1arg1q4a9qlfw6fqyhis"; + type = "gem"; + }; + version = "3.0.5"; + }; + rack-proxy = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1a62439xwn5v6hsl9s11hdk4wj58czhcbg7lminv23mnkc0ca147"; + type = "gem"; + }; + version = "0.7.6"; + }; + rack-test = { + dependencies = ["rack"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ysx29gk9k14a14zsp5a8czys140wacvp91fja8xcja0j1hzqq8c"; + type = "gem"; + }; + version = "2.1.0"; + }; + rack_session_access = { + dependencies = ["builder" "rack"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0swd35lg7qmqhc3pglvsanq2indnvw360m8qxfxwqabl0br9isq3"; + type = "gem"; + }; + version = "0.2.0"; + }; + rails = { + dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pxi3psfl4kpgjf6bhch1albjy9knn9c2s6sammy9lyckhh7akhq"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + rails-controller-testing = { + dependencies = ["actionpack" "actionview" "activesupport"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "151f303jcvs8s149mhx2g5mn67487x0blrf9dzl76q1nb7dlh53l"; + type = "gem"; + }; + version = "1.0.5"; + }; + rails-dom-testing = { + dependencies = ["activesupport" "minitest" "nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0fx9dx1ag0s1lr6lfr34lbx5i1bvn3bhyf3w3mx6h7yz90p725g5"; + type = "gem"; + }; + version = "2.2.0"; + }; + rails-erd = { + dependencies = ["activerecord" "activesupport" "choice" "ruby-graphviz"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dnj1vasfh3349sbxq6279ky377fqmf5pfnjfnl9wxrf6idygbpa"; + type = "gem"; + }; + version = "1.6.1"; + }; + rails-html-sanitizer = { + dependencies = ["loofah" "nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pm4z853nyz1bhhqr7fzl44alnx4bjachcr6rh6qjj375sfz3sc6"; + type = "gem"; + }; + version = "1.6.0"; + }; + rails-i18n = { + dependencies = ["i18n" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lrbrx88ic42adcj36wip3dk1svmqld1f7qksngi4b9kqnc8w5g3"; + type = "gem"; + }; + version = "7.0.3"; + }; + railties = { + dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor" "zeitwerk"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01pdn9sn7kawwrvrbr3vz44j287xbka8mm7nrv9cl510y8gzxi2x"; + type = "gem"; + }; + version = "7.0.7.2"; + }; + rainbow = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0smwg4mii0fm38pyb5fddbmrdpifwv22zv3d3px2xx497am93503"; + type = "gem"; + }; + version = "3.1.1"; + }; + rake = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w"; + type = "gem"; + }; + version = "13.0.6"; + }; + rake-progressbar = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wynsd94kh3mrp5c1n1bvkvbcpvqq8nqnn0i9xjh2mk8k6cgqipr"; + type = "gem"; + }; + version = "0.0.5"; + }; + rb-fsevent = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zmf31rnpm8553lqwibvv3kkx0v7majm1f341xbxc0bk5sbhp423"; + type = "gem"; + }; + version = "0.11.2"; + }; + rb-inotify = { + dependencies = ["ffi"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005"; + type = "gem"; + }; + version = "0.10.1"; + }; + redcarpet = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1sg9sbf9pm91l7lac7fs4silabyn0vflxwaa2x3lrzsm0ff8ilca"; + type = "gem"; + }; + version = "3.6.0"; + }; + redis = { + dependencies = ["redis-client"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10r5z5mg1x5kjx3wvwx5d8bqgd2j8pc4dlaasq7nmnl3nsn7sn9k"; + type = "gem"; + }; + version = "5.0.6"; + }; + redis-client = { + dependencies = ["connection_pool"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ih4zghnb888jd5vh8ymvvkfx9bq7cyhi750zgvl7s64bzphwz9v"; + type = "gem"; + }; + version = "0.14.1"; + }; + regexp_parser = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "136br91alxdwh1s85z912dwz23qlhm212vy6i3wkinz3z8mkxxl3"; + type = "gem"; + }; + version = "2.8.1"; + }; + request_store = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cx74kispmnw3ljwb239j65a2j14n8jlsygy372hrsa8mxc71hxi"; + type = "gem"; + }; + version = "1.5.0"; + }; + responders = { + dependencies = ["actionpack" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0m9s0mkkprrz02gxhq0ijlwjy0nx1j5yrjf8ssjnhyagnx03lyrx"; + type = "gem"; + }; + version = "3.1.0"; + }; + rest-client = { + dependencies = ["http-accept" "http-cookie" "mime-types" "netrc"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1qs74yzl58agzx9dgjhcpgmzfn61fqkk33k1js2y5yhlvc5l19im"; + type = "gem"; + }; + version = "2.1.0"; + }; + rexml = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53"; + type = "gem"; + }; + version = "3.2.5"; + }; + rodf = { + dependencies = ["builder" "dry-inflector" "rubyzip"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1h2jflga597bdrlz7m1n58sx8a3bnrn8z3npal7v2wz2a2wx2xn0"; + type = "gem"; + }; + version = "1.1.1"; + }; + rotp = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10mmzc85y7andsich586ndykw678qn1ns2wpjxrg0sc0gr4w3pig"; + type = "gem"; + }; + version = "6.2.2"; + }; + rouge = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dnfkrk8xx2m8r3r9m2p5xcq57viznyc09k7r3i4jbm758i57lx3"; + type = "gem"; + }; + version = "3.30.0"; + }; + rqrcode = { + dependencies = ["chunky_png" "rqrcode_core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0f1cv9a9sjqc898qm3h7zmkhwglrjw5blsskbg3gsaws01d4bc47"; + type = "gem"; + }; + version = "1.2.0"; + }; + rqrcode_core = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00kqasqja8zyzqvlgiwd9r0wndqk01qk5j68a8lhlz4ayrd4qy0y"; + type = "gem"; + }; + version = "0.2.0"; + }; + rspec-core = { + dependencies = ["rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l95bnjxdabrn79hwdhn2q1n7mn26pj7y1w5660v5qi81x458nqm"; + type = "gem"; + }; + version = "3.12.2"; + }; + rspec-expectations = { + dependencies = ["diff-lcs" "rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05j44jfqlv7j2rpxb5vqzf9hfv7w8ba46wwgxwcwd8p0wzi1hg89"; + type = "gem"; + }; + version = "3.12.3"; + }; + rspec-mocks = { + dependencies = ["diff-lcs" "rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hfm17xakfvwya236graj6c2arr4sb9zasp35q5fykhyz8mhs0w2"; + type = "gem"; + }; + version = "3.12.5"; + }; + rspec-rails = { + dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0d3fnabkaw8n0na2dpnlg2xygggj51djzpj9x6y5rkiqbfyqwv01"; + type = "gem"; + }; + version = "6.0.1"; + }; + rspec-retry = { + dependencies = ["rspec-core"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n6qc0d16h6bgh1xarmc8vc58728mgjcsjj8wcd822c8lcivl0b1"; + type = "gem"; + }; + version = "0.6.2"; + }; + rspec-support = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12y52zwwb3xr7h91dy9k3ndmyyhr3mjcayk0nnarnrzz8yr48kfx"; + type = "gem"; + }; + version = "3.12.0"; + }; + rspec_junit_formatter = { + dependencies = ["rspec-core"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1aynmrgnv26pkprrajvp7advb8nbh0x4pkwk6jwq8qmwzarzk21p"; + type = "gem"; + }; + version = "0.4.1"; + }; + rubocop = { + dependencies = ["json" "parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l46lw5gfj3mcm982wpmx7br4rs466gyislv0hfwcsk8dxhv1zkw"; + type = "gem"; + }; + version = "1.50.2"; + }; + rubocop-ast = { + dependencies = ["parser"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n2gsafg6p7nr1z8i1hkvp2qqkkbg842ba183dnl0h08xd9ms6q5"; + type = "gem"; + }; + version = "1.28.0"; + }; + rubocop-capybara = { + dependencies = ["rubocop"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pz52ml0qbxgcjlmp8y0wsq8xy398n6ypkbrwfaa8zb0v7pscj6n"; + type = "gem"; + }; + version = "2.17.1"; + }; + rubocop-performance = { + dependencies = ["rubocop" "rubocop-ast"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1z6i24r0485fxa5n4g3rhp88w589fifszhd1khbzya2iiknkjxkr"; + type = "gem"; + }; + version = "1.17.1"; + }; + rubocop-rails = { + dependencies = ["activesupport" "rack" "rubocop"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0j6dn8pz70bngx6van8yzsimpdd93gm7c8lr93wz1j4ahm6q4hn9"; + type = "gem"; + }; + version = "2.19.1"; + }; + rubocop-rspec = { + dependencies = ["rubocop" "rubocop-capybara"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ydmr0qhldrndh86zy87yyl17i1mcxfv83jzb6lmx18cghkz7lpd"; + type = "gem"; + }; + version = "2.20.0"; + }; + ruby-graphviz = { + dependencies = ["rexml"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "010m283gk4qgzxkgrldlnrglh8d5fn6zvrzm56wf5abd7x7b8aqw"; + type = "gem"; + }; + version = "1.2.5"; + }; + ruby-progressbar = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cwvyb7j47m7wihpfaq7rc47zwwx9k4v7iqd9s1xch5nm53rrz40"; + type = "gem"; + }; + version = "1.13.0"; + }; + ruby-vips = { + dependencies = ["ffi"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19pzpx406rr9s3qk527rn9y3b76sjq5pi7y0xzqiy50q3k0hhg7g"; + type = "gem"; + }; + version = "2.1.4"; + }; + ruby2_keywords = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz"; + type = "gem"; + }; + version = "0.0.5"; + }; + rubyzip = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz"; + type = "gem"; + }; + version = "2.3.2"; + }; + saml_idp = { + dependencies = ["activesupport" "builder" "nokogiri" "rexml" "xmlenc"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0h57ls13k0f3rni5lf1xy2mv9g6f80c8x0fnv9yc5g4hyj44af9m"; + type = "gem"; + }; + version = "0.14.0"; + }; + sanitize = { + dependencies = ["crass" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kymrjdpbmn4yaml3aaqyj1dzj8gqmm9h030dc2rj5mvja7fpi28"; + type = "gem"; + }; + version = "6.0.2"; + }; + sass = { + dependencies = ["sass-listen"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0p95lhs0jza5l7hqci1isflxakz83xkj97lkvxl919is0lwhv2w0"; + type = "gem"; + }; + version = "3.7.4"; + }; + sass-listen = { + dependencies = ["rb-fsevent" "rb-inotify"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xw3q46cmahkgyldid5hwyiwacp590zj2vmswlll68ryvmvcp7df"; + type = "gem"; + }; + version = "4.0.0"; + }; + sassc = { + dependencies = ["ffi"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gpqv48xhl8mb8qqhcifcp0pixn206a7imc07g48armklfqa4q2c"; + type = "gem"; + }; + version = "2.4.0"; + }; + sassc-rails = { + dependencies = ["railties" "sassc" "sprockets" "sprockets-rails" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d9djmwn36a5m8a83bpycs48g8kh1n2xkyvghn7dr6zwh4wdyksz"; + type = "gem"; + }; + version = "2.1.2"; + }; + scss_lint = { + dependencies = ["sass"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1s6dzk4n9pnmqciliggwpiny43vc3cx3n2d5gqa9aqng77ff7yv7"; + type = "gem"; + }; + version = "0.59.0"; + }; + selectize-rails = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1adzp7b3qyl4ki1432mga914za0j9dzy7401vs92kl4avr40nns2"; + type = "gem"; + }; + version = "0.12.6"; + }; + selenium-devtools = { + dependencies = ["selenium-webdriver"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "07qfhkviz26ahf21wjm9ijk33qy0v4q5m151mb804va1y8wl9jhz"; + type = "gem"; + }; + version = "0.114.0"; + }; + selenium-webdriver = { + dependencies = ["rexml" "rubyzip" "websocket"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hwxxvx6j95ln82pjmrgyzg6qmf511dkcp5q79n6m5m8z4way8m3"; + type = "gem"; + }; + version = "4.10.0"; + }; + sentry-delayed_job = { + dependencies = ["delayed_job" "sentry-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cpyjwbfsq50jnz0rp9y8ffc6r22g2lgf8bi04c37n691mrvayq2"; + type = "gem"; + }; + version = "5.9.0"; + }; + sentry-rails = { + dependencies = ["railties" "sentry-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1krl5ahgnb6bh8p5f2w8642jvsdf2qx3n0jwwz59yk3czbwagn3i"; + type = "gem"; + }; + version = "5.9.0"; + }; + sentry-ruby = { + dependencies = ["concurrent-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "140bbc709vwhi330mxb78c6ca5l7n97vpwqdwa068pv3dnzxbzj8"; + type = "gem"; + }; + version = "5.9.0"; + }; + shoulda-matchers = { + dependencies = ["activesupport"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1qi7gzli00mqlaq9an28m6xd323k7grgq19r6dqa2amjnnxy41ld"; + type = "gem"; + }; + version = "4.5.1"; + }; + sib-api-v3-sdk = { + dependencies = ["json" "typhoeus"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z8s6a5a95myr7kcg1w40qfb3n7043g1bxmmzrnp32j358znkr9d"; + type = "gem"; + }; + version = "7.4.0"; + }; + simple_xlsx_reader = { + dependencies = ["nokogiri" "rubyzip"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kyw7yvcqcbiwl10s6nrk8qzjj8dl47ahaj0ikpyvya8ihr5fw26"; + type = "gem"; + }; + version = "1.0.4"; + }; + sinatra = { + dependencies = ["mustermann" "rack" "rack-protection" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ryfja9yd3fq8n1p5yi3qnd0pjk7bkycmxxmbb1bj0axlr1pdv20"; + type = "gem"; + }; + version = "3.0.5"; + }; + skylight = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09c4wzqg0ndgfmwxzy6bzb7lzqdq7qz6y6xka3mfdvx8s7z8dslj"; + type = "gem"; + }; + version = "6.0.1"; + }; + smart_properties = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jrqssk9qhwrpq41arm712226vpcr458xv6xaqbk8cp94a0kycpr"; + type = "gem"; + }; + version = "1.17.0"; + }; + spreadsheet_architect = { + dependencies = ["axlsx_styler" "caxlsx" "rodf"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cw139wd2q7bl1ibqmiwr9ndz86nhiw3apqmy6by7y8pfn4s8qrn"; + type = "gem"; + }; + version = "4.1.0"; + }; + spring = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wvdvwp395cc9srjy0fak5sy0531x7yh358cvmwlkbz0zlb0290x"; + type = "gem"; + }; + version = "4.1.1"; + }; + spring-commands-rspec = { + dependencies = ["spring"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0b0svpq3md1pjz5drpa5pxwg8nk48wrshq8lckim4x3nli7ya0k2"; + type = "gem"; + }; + version = "1.0.4"; + }; + sprockets = { + dependencies = ["concurrent-ruby" "rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k0236g4h3ax7v6vp9k0l2fa0w6f1wqp7dn060zm4isw4n3k89sw"; + type = "gem"; + }; + version = "4.2.0"; + }; + sprockets-rails = { + dependencies = ["actionpack" "activesupport" "sprockets"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1b9i14qb27zs56hlcc2hf139l0ghbqnjpmfi0054dxycaxvk5min"; + type = "gem"; + }; + version = "3.4.2"; + }; + stackprof = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bpmrz2vw59gw556y5hsha3xlrvfv4qwck4wg2r39qf2bp2hcr1b"; + type = "gem"; + }; + version = "0.2.21"; + }; + strong_migrations = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wz4zhsp4xia8zcpi98v4sgjlv2prd515l8jz4f7j0wk45dfkjs1"; + type = "gem"; + }; + version = "0.8.0"; + }; + swd = { + dependencies = ["activesupport" "attr_required" "httpclient"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12b3q2sw42nnilfb51nlqdv07f31vdv2j595kd99asnkw4cjlf5w"; + type = "gem"; + }; + version = "1.3.0"; + }; + sysexits = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qjng6pllznmprzx8vb0zg0c86hdrkyjs615q41s9fjpmv2430jr"; + type = "gem"; + }; + version = "1.2.0"; + }; + temple = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "060zzj7c2kicdfk6cpnn40n9yjnhfrr13d0rsbdhdij68chp2861"; + type = "gem"; + }; + version = "0.8.2"; + }; + terminal-table = { + dependencies = ["unicode-display_width"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "14dfmfjppmng5hwj7c5ka6qdapawm3h6k9lhn8zj001ybypvclgr"; + type = "gem"; + }; + version = "3.0.2"; + }; + thor = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k7j2wn14h1pl4smibasw0bp66kg626drxb59z7rzflch99cd4rg"; + type = "gem"; + }; + version = "1.2.2"; + }; + thread_safe = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nmhcgq6cgz44srylra07bmaw99f5271l0dpsvl5f75m44l0gmwy"; + type = "gem"; + }; + version = "0.3.6"; + }; + tilt = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "186nfbcsk0l4l86gvng1fw6jq6p6s7rc0caxr23b3pnbfb20y63v"; + type = "gem"; + }; + version = "2.0.11"; + }; + timecop = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fw3nzycvd15qa7sxy9dxb4hqyizy1s8f7q3d50smbzyyvr8fvia"; + type = "gem"; + }; + version = "0.9.4"; + }; + timeout = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d9cvm0f4zdpwa795v3zv4973y5zk59j7s1x3yn90jjrhcz1yvfd"; + type = "gem"; + }; + version = "0.4.0"; + }; + ttfunk = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15iaxz9iak5643bq2bc0jkbjv8w2zn649lxgvh5wg48q9d4blw13"; + type = "gem"; + }; + version = "1.7.0"; + }; + turbo-rails = { + dependencies = ["actionpack" "activejob" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "07xbklyfs7yjs3v83qr2via9k9ik2wzkcqhjqylzpdjymrk6py11"; + type = "gem"; + }; + version = "1.3.2"; + }; + typhoeus = { + dependencies = ["ethon"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1m22yrkmbj81rzhlny81j427qdvz57yk5wbcf3km0nf3bl6qiygz"; + type = "gem"; + }; + version = "1.4.0"; + }; + tzinfo = { + dependencies = ["concurrent-ruby"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16w2g84dzaf3z13gxyzlzbf748kylk5bdgg3n1ipvkvvqy685bwd"; + type = "gem"; + }; + version = "2.0.6"; + }; + ulid-ruby = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1949zg2gzc56c9zjmkrg9lp7nnvawmm8rivq16ldgg99485kh9bp"; + type = "gem"; + }; + version = "1.0.2"; + }; + unf = { + dependencies = ["unf_ext"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9"; + type = "gem"; + }; + version = "0.1.4"; + }; + unf_ext = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wc47r23h063l8ysws8sy24gzh74mks81cak3lkzlrw4qkqb3sg4"; + type = "gem"; + }; + version = "0.0.7.7"; + }; + unicode-display_width = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gi82k102q7bkmfi7ggn9ciypn897ylln1jk9q67kjhr39fj043a"; + type = "gem"; + }; + version = "2.4.2"; + }; + uri_template = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0p8qbxlpmg3msw0ihny6a3gsn0yvydx9ksh5knn8dnq06zhqyb1i"; + type = "gem"; + }; + version = "0.7.0"; + }; + validate_email = { + dependencies = ["activemodel" "mail"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1r1fz29l699arka177c9xw7409d1a3ff95bf7a6pmc97slb91zlx"; + type = "gem"; + }; + version = "0.1.6"; + }; + validate_url = { + dependencies = ["activemodel" "public_suffix"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bwj34rz7961rrl545f006m2jdz1nrc0m72gfqmnb41xwsvpagbk"; + type = "gem"; + }; + version = "1.0.13"; + }; + vcr = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xzd8f17mmcq9f6lxg4w0x4nd9pyp41lr77gjzxwynijzp8rcgjl"; + type = "gem"; + }; + version = "6.1.0"; + }; + view_component = { + dependencies = ["activesupport" "concurrent-ruby" "method_source"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bwvpkv1iqa8g5cmmllx8fx0nprapzrzfvf1m15rr3wxw5hrbdn8"; + type = "gem"; + }; + version = "2.82.0"; + }; + virtus = { + dependencies = ["axiom-types" "coercible" "descendants_tracker"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hniwgbdsjxa71qy47n6av8faf8qpwbaapms41rhkk3zxgjdlhc8"; + type = "gem"; + }; + version = "2.0.0"; + }; + vite_rails = { + dependencies = ["railties" "vite_ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "035bjh0db28bgjx6hf01ykrrl4088gygnsva1x7asznzd9aq4669"; + type = "gem"; + }; + version = "3.0.14"; + }; + vite_ruby = { + dependencies = ["dry-cli" "rack-proxy" "zeitwerk"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17829mqzkksm8azcysym3bnivj89mjdzhykisiia5qz7ac4r0icr"; + type = "gem"; + }; + version = "3.3.1"; + }; + warden = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l7gl7vms023w4clg02pm4ky9j12la2vzsixi2xrv9imbn44ys26"; + type = "gem"; + }; + version = "1.2.9"; + }; + watir = { + dependencies = ["regexp_parser" "selenium-webdriver"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1aygylc0xayy2lsi9423ijszwgblm618ys9kpm285y770yxnia49"; + type = "gem"; + }; + version = "6.19.1"; + }; + web-console = { + dependencies = ["actionview" "activemodel" "bindex" "railties"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0d9hk929cmisix2l1w9kkh05b57ih9yvnh4wv52axxw41scnv2d9"; + type = "gem"; + }; + version = "4.1.0"; + }; + webfinger = { + dependencies = ["activesupport" "httpclient"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18jj50b44a471ig7hw1ax90wxaaz40acmrf6cm7m2iyshlffy53q"; + type = "gem"; + }; + version = "1.2.0"; + }; + webmock = { + dependencies = ["addressable" "crack" "hashdiff"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hdlbvfw316lkz251qnfk79drmaay7l51kidvicz41nhvw12xz8v"; + type = "gem"; + }; + version = "3.11.2"; + }; + websocket = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dib6p55sl606qb4vpwrvj5wh881kk4aqn2zpfapf8ckx7g14jw8"; + type = "gem"; + }; + version = "1.2.9"; + }; + websocket-driver = { + dependencies = ["websocket-extensions"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nyh873w4lvahcl8kzbjfca26656d5c6z3md4sbqg5y1gfz0157n"; + type = "gem"; + }; + version = "0.7.6"; + }; + websocket-extensions = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw"; + type = "gem"; + }; + version = "0.1.5"; + }; + xmlenc = { + dependencies = ["activemodel" "activesupport" "nokogiri" "xmlmapper"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09504vaqq37vwihsvy5skbi9vhbimqivanmgrkg4b7mry0rsxqmv"; + type = "gem"; + }; + version = "0.8.0"; + }; + xmlmapper = { + dependencies = ["nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xsglrl47p81ap0yh2vwb6z1hb7j6vax008bqx3mq665l6zf2chs"; + type = "gem"; + }; + version = "0.8.1"; + }; + xpath = { + dependencies = ["nokogiri"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd"; + type = "gem"; + }; + version = "3.2.0"; + }; + zeitwerk = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1mwdd445w63khz13hpv17m2br5xngyjl3jdj08xizjbm78i2zrxd"; + type = "gem"; + }; + version = "2.6.11"; + }; + zip_tricks = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06gaba552jsxzx0gfmjypzm89jzhlg2iw3nfhrpyxkkvv4jljr7a"; + type = "gem"; + }; + version = "5.6.0"; + }; + zipline = { + dependencies = ["actionpack" "content_disposition" "zip_tricks"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1glg6x2p9gi3rlmy0aqy9pqkncbkn5jmzn3lqs8mw6q06gvrc9pv"; + type = "gem"; + }; + version = "1.4.1"; + }; + zxcvbn-ruby = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0afxvi4hy49civms434l6ndm5wcfq0gf5pkgmw7bjxhwfl5jg0c1"; + type = "gem"; + }; + version = "1.2.0"; + }; +} + diff --git a/machines/compute01/ds-fr/package/update.sh b/machines/compute01/ds-fr/package/update.sh new file mode 100755 index 0000000..1080909 --- /dev/null +++ b/machines/compute01/ds-fr/package/update.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +version= +gitArgs= + +while [ "$#" -gt 0 ]; do + i="$1" + shift 1 + case "$i" in + --version|-v) + version="$1" + shift 1 + ;; + --git-args) + gitArgs="$gitArgs $1" + shift 1 + ;; + *) + echo "$0: unknown option \`$i'" + exit 1 + ;; + esac +done + +# Create a working environment +CWD=$(pwd) + +TMP=$(mktemp -d) +cd "$TMP" + +# Fetch the latest source or the required version +gitUrl="https://github.com/demarches-simplifiees/demarches-simplifiees.fr.git" + +if [ -n "$version" ]; then + git clone --depth 1 --branch $version $gitUrl . +else + git clone --depth 1 $gitUrl . +fi + +# Generate gemset.nix +nix-shell -p bundix --run "bundix -l" + +# Copy the new files +cp gemset.nix Gemfile Gemfile.lock "$CWD/rubyEnv/" + +# Print the new source details +nix-shell -p nurl --run "nurl $gitUrl $version" diff --git a/machines/compute01/kanidm/default.nix b/machines/compute01/kanidm/default.nix index 57b902a..8f849de 100644 --- a/machines/compute01/kanidm/default.nix +++ b/machines/compute01/kanidm/default.nix @@ -5,7 +5,7 @@ let cert = config.security.acme.certs.${domain}; - allowedSubDomains = [ "cloud" "git" "videos" "social" ]; + allowedSubDomains = [ "cloud" "git" "videos" "social" "demarches" ]; in { services.kanidm = { enableServer = true; diff --git a/machines/compute01/secrets/ds_fr-secret_file b/machines/compute01/secrets/ds_fr-secret_file new file mode 100644 index 0000000..88c0f7f Binary files /dev/null and b/machines/compute01/secrets/ds_fr-secret_file differ diff --git a/machines/compute01/secrets/secrets.nix b/machines/compute01/secrets/secrets.nix index 7a01886..1e8b675 100644 --- a/machines/compute01/secrets/secrets.nix +++ b/machines/compute01/secrets/secrets.nix @@ -4,6 +4,7 @@ let in lib.setDefault { inherit publicKeys; } [ + "ds_fr-secret_file" "mastodon-extra_env_file" "nextcloud-adminpass_file" "nextcloud-s3_secret_file"