diff --git a/.env.example b/.env.example index 96e32edcc..b91035f70 100644 --- a/.env.example +++ b/.env.example @@ -5,4 +5,4 @@ AWS_ACCESS_KEY_ID="abc" AWS_SECRET_ACCESS_KEY="123" AWS_REGION="us-east-1" AWS_ENDPOINT="" -SPARKPOST_API_KEY="foo" +SENDGRID_API_KEY="foo" diff --git a/.gitignore b/.gitignore index 3ec128763..1013cc1ca 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,8 @@ /public/assets .byebug_history +/coverage + # Ignore master key for decrypting credentials and more. /config/master.key @@ -33,3 +35,6 @@ /.idea .generators + +# macOS +.DS_Store diff --git a/.ruby-version b/.ruby-version index 57cf282eb..338a5b5d8 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.5 +2.6.6 diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b3bb393..306fd5f87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ ## [1.22.4](https://github.com/codeRIT/hackathon-manager/compare/v1.22.3...v1.22.4) (2020-05-26) - ### Bug Fixes * **questionnaire:** Fixes error when trying to view a questionnaire modified by a deleted admin ([#236](https://github.com/codeRIT/hackathon-manager/issues/236)) ([](https://github.com/codeRIT/hackathon-manager/commit/2ffe116)) diff --git a/Gemfile b/Gemfile index 0ad1f9686..5a42c21fe 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '>= 2.5' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 5.2.4.3' +gem 'rails', '~> 5.2.4.4' # Use mysql as the database for Active Record gem 'mysql2', '>= 0.4.4', '< 0.6.0' # Use Puma as the app server @@ -39,7 +39,7 @@ gem 'bootsnap', '>= 1.1.0', require: false # Authentication gem 'devise', '~> 4.7' -gem 'omniauth-mlh', '~> 0.1' +gem 'omniauth-mlh', '~> 0.4.1' gem 'doorkeeper', '~> 5.0' gem 'devise-doorkeeper' gem 'omniauth-rails_csrf_protection' @@ -82,10 +82,9 @@ gem 'sidekiq-cron', '~> 1.1' gem 'rails-settings-cached', '~> 0.7.2' gem 'blazer' gem 'simple_spark' -gem 'sparkpost_rails' +gem 'sendgrid-actionmailer' gem 'httparty' gem 'rollbar', '~> 2.8' -gem 'skylight' gem 'rubyzip', '>= 1.3.0' gem 'rails_12factor', group: :production diff --git a/Gemfile.lock b/Gemfile.lock index f0efe7c65..b01261f5d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,43 +1,43 @@ GEM remote: https://rubygems.org/ specs: - actioncable (5.2.4.3) - actionpack (= 5.2.4.3) + actioncable (5.2.4.4) + actionpack (= 5.2.4.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.4.3) - actionpack (= 5.2.4.3) - actionview (= 5.2.4.3) - activejob (= 5.2.4.3) + actionmailer (5.2.4.4) + actionpack (= 5.2.4.4) + actionview (= 5.2.4.4) + activejob (= 5.2.4.4) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.4.3) - actionview (= 5.2.4.3) - activesupport (= 5.2.4.3) + actionpack (5.2.4.4) + actionview (= 5.2.4.4) + activesupport (= 5.2.4.4) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.4.3) - activesupport (= 5.2.4.3) + actionview (5.2.4.4) + activesupport (= 5.2.4.4) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.2.4.3) - activesupport (= 5.2.4.3) + activejob (5.2.4.4) + activesupport (= 5.2.4.4) globalid (>= 0.3.6) - activemodel (5.2.4.3) - activesupport (= 5.2.4.3) - activerecord (5.2.4.3) - activemodel (= 5.2.4.3) - activesupport (= 5.2.4.3) + activemodel (5.2.4.4) + activesupport (= 5.2.4.4) + activerecord (5.2.4.4) + activemodel (= 5.2.4.4) + activesupport (= 5.2.4.4) arel (>= 9.0) - activestorage (5.2.4.3) - actionpack (= 5.2.4.3) - activerecord (= 5.2.4.3) + activestorage (5.2.4.4) + actionpack (= 5.2.4.4) + activerecord (= 5.2.4.4) marcel (~> 0.3.1) - activesupport (5.2.4.3) + activesupport (5.2.4.4) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -53,24 +53,24 @@ GEM arel (9.0.0) audited (4.9.0) activerecord (>= 4.2, < 6.1) - autoprefixer-rails (9.7.6) + autoprefixer-rails (9.8.4) execjs aws-eventstream (1.1.0) - aws-partitions (1.317.0) - aws-sdk-core (3.96.1) + aws-partitions (1.336.0) + aws-sdk-core (3.102.1) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.31.0) - aws-sdk-core (~> 3, >= 3.71.0) + aws-sdk-kms (1.35.0) + aws-sdk-core (~> 3, >= 3.99.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.65.0) - aws-sdk-core (~> 3, >= 3.96.1) + aws-sdk-s3 (1.72.0) + aws-sdk-core (~> 3, >= 3.102.1) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) - aws-sigv4 (1.1.3) - aws-eventstream (~> 1.0, >= 1.0.2) + aws-sigv4 (1.2.1) + aws-eventstream (~> 1, >= 1.0.2) bcrypt (3.1.13) better_errors (2.7.1) coderay (>= 1.0.0) @@ -79,7 +79,7 @@ GEM bindex (0.8.1) binding_of_caller (0.8.0) debug_inspector (>= 0.0.1) - blazer (2.2.2) + blazer (2.2.5) activerecord (>= 5) chartkick (>= 3.2) railties (>= 5) @@ -92,7 +92,7 @@ GEM sassc-rails (>= 2.0.0) builder (3.2.4) byebug (11.1.3) - capybara (3.32.2) + capybara (3.33.0) addressable mini_mime (>= 0.1.3) nokogiri (~> 1.8) @@ -107,16 +107,16 @@ GEM nokogiri (~> 1.8) codeclimate-test-reporter (0.6.0) simplecov (>= 0.7.1, < 1.0.0) - coderay (1.1.2) - concurrent-ruby (1.1.6) - connection_pool (2.2.2) + coderay (1.1.3) + concurrent-ruby (1.1.7) + connection_pool (2.2.3) crack (0.4.3) safe_yaml (~> 1.0.0) crass (1.0.6) css_parser (1.7.1) addressable debug_inspector (0.0.3) - devise (4.7.1) + devise (4.7.2) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) @@ -138,25 +138,25 @@ GEM erubis (2.7.0) et-orbi (1.2.4) tzinfo - excon (0.73.0) + excon (0.75.0) execjs (2.7.0) - factory_bot (5.2.0) - activesupport (>= 4.2.0) - factory_bot_rails (5.2.0) - factory_bot (~> 5.2.0) - railties (>= 4.2.0) + factory_bot (6.0.2) + activesupport (>= 5.0.0) + factory_bot_rails (6.0.0) + factory_bot (~> 6.0.0) + railties (>= 5.0.0) faraday (1.0.1) multipart-post (>= 1.2, < 3) - ffi (1.12.2) + ffi (1.13.1) file_validators (2.3.0) activemodel (>= 3.2) mime-types (>= 1.0) font-awesome-rails (4.7.0.5) railties (>= 3.2, < 6.1) formatador (0.2.5) - fugit (1.3.5) + fugit (1.3.6) et-orbi (~> 1.1, >= 1.1.8) - raabro (~> 1.1) + raabro (~> 1.3) globalid (0.4.2) activesupport (>= 4.2.0) groupdate (5.0.0) @@ -192,10 +192,10 @@ GEM haml (>= 4.0, < 6) nokogiri (>= 1.6.0) ruby_parser (~> 3.5) - httparty (0.18.0) + httparty (0.18.1) mime-types (~> 3.0) multi_xml (>= 0.5.2) - i18n (1.8.2) + i18n (1.8.5) concurrent-ruby (~> 1.0) io-like (0.3.1) jmespath (1.4.0) @@ -211,10 +211,10 @@ GEM rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) ruby_dep (~> 1.2) - loofah (2.5.0) + loofah (2.7.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) - lumberjack (1.2.4) + lumberjack (1.2.6) mail (2.7.1) mini_mime (>= 0.1.1) marcel (0.3.3) @@ -226,21 +226,21 @@ GEM mimemagic (0.3.5) mini_mime (1.0.2) mini_portile2 (2.4.0) - minitest (5.14.1) + minitest (5.14.2) minitest-reporters (1.4.2) ansi builder minitest (>= 5.0) ruby-progressbar msgpack (1.3.3) - multi_json (1.14.1) + multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) mustache (1.1.1) mysql2 (0.5.3) nenv (0.3.0) - nio4r (2.5.2) - nokogiri (1.10.9) + nio4r (2.5.3) + nokogiri (1.10.10) mini_portile2 (~> 2.4.0) notiffany (0.1.3) nenv (~> 0.1) @@ -254,7 +254,7 @@ GEM omniauth (1.9.1) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) - omniauth-mlh (0.3.1) + omniauth-mlh (0.4.1) activesupport omniauth (~> 1.0) omniauth-oauth2 (~> 1.3.1) @@ -279,23 +279,23 @@ GEM rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (5.2.4.3) - actioncable (= 5.2.4.3) - actionmailer (= 5.2.4.3) - actionpack (= 5.2.4.3) - actionview (= 5.2.4.3) - activejob (= 5.2.4.3) - activemodel (= 5.2.4.3) - activerecord (= 5.2.4.3) - activestorage (= 5.2.4.3) - activesupport (= 5.2.4.3) + rails (5.2.4.4) + actioncable (= 5.2.4.4) + actionmailer (= 5.2.4.4) + actionpack (= 5.2.4.4) + actionview (= 5.2.4.4) + activejob (= 5.2.4.4) + activemodel (= 5.2.4.4) + activerecord (= 5.2.4.4) + activestorage (= 5.2.4.4) + activesupport (= 5.2.4.4) bundler (>= 1.3.0) - railties (= 5.2.4.3) + railties (= 5.2.4.4) sprockets-rails (>= 2.0.0) - rails-controller-testing (1.0.4) - actionpack (>= 5.0.1.x) - actionview (>= 5.0.1.x) - activesupport (>= 5.0.1.x) + 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.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) @@ -308,9 +308,9 @@ GEM rails_stdout_logging rails_serve_static_assets (0.0.5) rails_stdout_logging (0.0.5) - railties (5.2.4.3) - actionpack (= 5.2.4.3) - activesupport (= 5.2.4.3) + railties (5.2.4.4) + actionpack (= 5.2.4.4) + activesupport (= 5.2.4.4) method_source rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) @@ -319,9 +319,9 @@ GEM rb-inotify (0.10.1) ffi (~> 1.0) redcarpet (3.5.0) - redis (4.1.4) - regexp_parser (1.7.0) - responders (3.0.0) + redis (4.2.1) + regexp_parser (1.7.1) + responders (3.0.1) actionpack (>= 5.0) railties (>= 5.0) roadie (4.0.0) @@ -330,9 +330,10 @@ GEM roadie-rails (2.1.1) railties (>= 5.1, < 6.1) roadie (>= 3.1, < 5.0) - rollbar (2.25.0) + rollbar (2.26.0) ruby-progressbar (1.10.1) ruby_dep (1.5.0) + ruby_http_client (3.5.0) ruby_parser (3.14.2) sexp_processor (~> 4.9) rubyzip (2.3.0) @@ -341,7 +342,7 @@ GEM errbase (>= 0.1.1) sass-rails (6.0.0) sassc-rails (~> 2.1, >= 2.1.1) - sassc (2.3.0) + sassc (2.4.0) ffi (~> 1.9) sassc-rails (2.1.2) railties (>= 4.0.0) @@ -353,7 +354,12 @@ GEM selenium-webdriver (3.142.7) childprocess (>= 0.5, < 4.0) rubyzip (>= 1.2.2) - sexp_processor (4.14.1) + sendgrid-actionmailer (3.0.2) + mail (~> 2.7) + sendgrid-ruby (~> 6.0) + sendgrid-ruby (6.3.2) + ruby_http_client (~> 3.4) + sexp_processor (4.15.0) shellany (0.0.1) shoulda (3.5.0) shoulda-context (~> 1.0, >= 1.0.1) @@ -379,17 +385,11 @@ GEM docile (~> 1.1) simplecov-html (~> 0.11) simplecov-html (0.12.2) - skylight (4.3.0) - skylight-core (= 4.3.0) - skylight-core (4.3.0) - activesupport (>= 4.2.0) - sparkpost_rails (1.5.2) - rails (>= 4.0, < 6.1) spring (2.1.0) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (4.0.0) + sprockets (4.0.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-rails (3.2.1) @@ -399,7 +399,7 @@ GEM strip_attributes (1.11.0) activemodel (>= 3.0, < 7.0) temple (0.8.2) - test-unit (3.3.5) + test-unit (3.3.6) power_assert thor (1.0.1) thread_safe (0.3.6) @@ -427,7 +427,7 @@ GEM addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - websocket-driver (0.7.1) + websocket-driver (0.7.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) xpath (3.2.0) @@ -470,10 +470,10 @@ DEPENDENCIES minitest-reporters mustache (~> 1.0) mysql2 (>= 0.4.4, < 0.6.0) - omniauth-mlh (~> 0.1) + omniauth-mlh (~> 0.4.1) omniauth-rails_csrf_protection puma (~> 4.3) - rails (~> 5.2.4.3) + rails (~> 5.2.4.4) rails-controller-testing rails-settings-cached (~> 0.7.2) rails_12factor @@ -485,6 +485,7 @@ DEPENDENCIES sass-rails (~> 6.0) selectize-rails selenium-webdriver + sendgrid-actionmailer shoulda (~> 3.5) shoulda-matchers (~> 2.0) sidekiq (< 7) @@ -492,8 +493,6 @@ DEPENDENCIES simple_form simple_spark simplecov - skylight - sparkpost_rails spring spring-watcher-listen (~> 2.0.0) sprockets @@ -508,7 +507,7 @@ DEPENDENCIES webmock (~> 3.4) RUBY VERSION - ruby 2.6.1p33 + ruby 2.6.6p146 BUNDLED WITH 1.17.2 diff --git a/README.md b/README.md index 3bbbe10ab..186e6619d 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,9 @@ HackathonManager makes use of a few different third-party services & Ruby gems: - [Devise](https://github.com/plataformatec/devise) + [MyMLH](https://my.mlh.io/) (authentication & attendee identity) - [Sidekiq](https://github.com/mperham/sidekiq) (background jobs) -- [SparkPost](https://www.sparkpost.com/) (email) -- [Amazon S3](https://aws.amazon.com/s3/) (resume storage) -- [Chartkick](http://chartkick.com/) (management UI charts) +- [SendGrid](https://sendgrid.com) (email) +- [Amazon S3](https://aws.amazon.com/s3) (resume storage) +- [Chartkick](http://chartkick.com) (management UI charts) - [Blazer](https://github.com/ankane/blazer) (custom SQL queries, analytics, and charts) - [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) (authentication via OAuth for API usage) diff --git a/app.json b/app.json index d32430241..513ec20af 100644 --- a/app.json +++ b/app.json @@ -58,12 +58,8 @@ "description": "Rollbar access token for code exception reporting", "required": false }, - "SPARKPOST_API_KEY": { - "description": "SparkPost API key for sending email", - "required": false - }, - "SPARKPOST_CAMPAIGN_ID": { - "description": "SparkPost campaign ID for sending email (e.g. the name of your hackathon)", + "SENDGRID_API_KEY": { + "description": "SendGrid API key for sending email", "required": false }, "HM_DOMAIN_NAME": { diff --git a/app/assets/javascripts/manage/lib/setupDataTables.js b/app/assets/javascripts/manage/lib/setupDataTables.js index 586c63577..f9418bc3c 100644 --- a/app/assets/javascripts/manage/lib/setupDataTables.js +++ b/app/assets/javascripts/manage/lib/setupDataTables.js @@ -17,15 +17,18 @@ var setupDataTables = function () { }); $('.datatable.users').DataTable({ - order: [1, 'asc'], + order: [8, 'desc'], columns: [ { orderable: true, data: 'id', visible: false }, - { orderable: true, data: 'email' }, + { orderable: false, data: 'link' }, + { orderable: true, data: 'first_name' }, + { orderable: true, data: 'last_name' }, + { orderable: true, data: 'email', visible: false }, { orderable: true, data: 'role' }, + { orderable: false, data: 'questionnaire'}, { orderable: true, data: 'active' }, - { orderable: true, data: 'receive_weekly_report' }, { orderable: true, data: 'created_at' }, - { orderable: true, data: 'current_sign_in_at' }, + { orderable: true, data: 'current_sign_in_at', visible: false }, { orderable: true, data: 'last_sign_in_at', visible: false }, { orderable: true, data: 'current_sign_in_ip', visible: false }, { orderable: true, data: 'last_sign_in_ip', visible: false }, @@ -33,6 +36,26 @@ var setupDataTables = function () { ], }); + $('.datatable.staff').DataTable({ + order: [2, 'asc'], + columns: [ + { orderable: true, data: 'id', visible: false }, + { orderable: false, data: 'link' }, + { orderable: true, data: 'first_name' }, + { orderable: true, data: 'last_name' }, + { orderable: true, data: 'email', visible: false }, + { orderable: true, data: 'role' }, + { orderable: true, data: 'active' }, + { orderable: true, data: 'receive_weekly_report' }, + { orderable: true, data: 'created_at', visible: false }, + { orderable: true, data: 'current_sign_in_at', visible: false }, + { orderable: true, data: 'last_sign_in_at', visible: false }, + { orderable: true, data: 'current_sign_in_ip', visible: false }, + { orderable: true, data: 'last_sign_in_ip', visible: false }, + { orderable: true, data: 'sign_in_count', visible: true }, + ], + }); + $('.datatable.bulk-messages').DataTable({ order: [4, 'desc'], columns: [ @@ -58,8 +81,72 @@ var setupDataTables = function () { ], }); - $('.datatable.stats').DataTable({ - processing: false, - serverSide: false, + // MARK: Datatables for the stats + + $('.datatable.stats-dietary').DataTable({ + order: [1, 'asc'], + columns: [ + { orderable: true, data: 'id', visible: false }, + { orderable: true, data: 'first_name' }, + { orderable: true, data: 'last_name' }, + { orderable: true, data: 'email' }, + { orderable: true, data: 'phone', visible: false }, + { orderable: false, data: 'questionnaire' }, + { orderable: true, data: 'checked_in_at', visible: false }, + { orderable: true, data: 'dietary_restrictions' }, + { orderable: true, data: 'special_needs' } + ] + }); + + $('.datatable.stats-notschooltravel').DataTable({ + order: [1, 'asc'], + columns: [ + { orderable: true, data: 'id', visible: false }, + { orderable: true, data: 'first_name' }, + { orderable: true, data: 'last_name' }, + { orderable: true, data: 'email' }, + { orderable: true, data: 'phone', visible: false }, + { orderable: false, data: 'questionnaire' }, + { orderable: true, data: 'travel_location' }, + { orderable: true, data: 'acc_status' } + ] + }); + + $('.datatable.stats-attendeeinfo').DataTable({ + columns: [ + { orderable: true, data: 'id', visible: false }, + { orderable: true, data: 'first_name' }, + { orderable: true, data: 'last_name' }, + { orderable: true, data: 'email' }, + { orderable: true, data: 'school_name' }, + { orderable: true, data: 'vcs_url' }, + { orderable: true, data: 'portfolio_url' } + ] + }); + + $('.datatable.stats-mlhinfo-applied').DataTable({ + order: [1, 'asc'], + columns: [ + { orderable: true, data: 'id', visible: false }, + { orderable: true, data: 'first_name' }, + { orderable: true, data: 'last_name' }, + { orderable: true, data: 'email' }, + { orderable: true, data: 'phone', visible: false }, + { orderable: true, data: 'school_name' } + ] + }); + + $('.datatable.stats-mlhinfo-checkedin').DataTable({ + order: [1, 'asc'], + columns: [ + { orderable: true, data: 'id', visible: false }, + { orderable: true, data: 'first_name' }, + { orderable: true, data: 'last_name' }, + { orderable: true, data: 'email' }, + { orderable: true, data: 'phone' }, + { orderable: true, data: 'school_name' } + ] }); + + }; diff --git a/app/assets/javascripts/manage/map.js b/app/assets/javascripts/manage/map.js index eed4c33a1..f16b3444e 100644 --- a/app/assets/javascripts/manage/map.js +++ b/app/assets/javascripts/manage/map.js @@ -61,7 +61,7 @@ $.fn.initMap = function() { }) .append('title') .text(function(d) { - return d.properties.name + '\nApplications: ' + formatNumber(appsById.get(d.id) || 0); + return d.properties.name + '\nQuestionnaires: ' + formatNumber(appsById.get(d.id) || 0); }); } diff --git a/app/assets/javascripts/validate.js b/app/assets/javascripts/validate.js index 6eec34797..8da91b2f8 100644 --- a/app/assets/javascripts/validate.js +++ b/app/assets/javascripts/validate.js @@ -40,6 +40,15 @@ document.addEventListener('turbolinks:load', function() { } } break; + case 'phone': + if (value) { + var phoneReg = /^[\+]?[0-9]{0,3}[-\s\.]?[(]?[0-9]{1,3}[)]?[-\s\.]?[0-9]{1,3}[-\s\.]?[0-9]{4,6}$/; + if (!phoneReg.test(value)) { + notify(this, 'Please enter a valid phone number'); + success = false; + } + } + break; case 'file-max-size': if ( this.files && diff --git a/app/assets/stylesheets/application.sass b/app/assets/stylesheets/application.sass index bf1d19b10..3a4b95ddb 100644 --- a/app/assets/stylesheets/application.sass +++ b/app/assets/stylesheets/application.sass @@ -25,6 +25,7 @@ @import general/table @import forms/forms @import forms/confirmation +@import forms/autocomplete @import general/theming-editor diff --git a/app/assets/stylesheets/forms/_autocomplete.sass b/app/assets/stylesheets/forms/_autocomplete.sass new file mode 100644 index 000000000..05e044650 --- /dev/null +++ b/app/assets/stylesheets/forms/_autocomplete.sass @@ -0,0 +1,24 @@ + +// jquery ui override +.ui-autocomplete + @include css4 + background: var(--input--background--focus) + border: 1px solid var(--input--border-color--focus) + color: var(--input--text--focus) + list-style: none + padding: 0 + .ui-menu-item div + padding: 2px 5px + display: block + cursor: pointer + overflow: hidden + text-overflow: ellipsis + white-space: nowrap + &:hover + @include css4 + background: var(--primary) + @include css4 + color: var(--white) +// needed for ellipsis in text to work and acts as a min-width +.ui-menu + width: 50px diff --git a/app/assets/stylesheets/forms/_forms.sass b/app/assets/stylesheets/forms/_forms.sass index 709d5d9ff..f3f635423 100644 --- a/app/assets/stylesheets/forms/_forms.sass +++ b/app/assets/stylesheets/forms/_forms.sass @@ -56,11 +56,16 @@ hr padding-right: 5px // custom styles -.form-container.login, .form-container.signup +.form-container.login, .form-container.signup, .form-container.password max-width: 360px .btn margin-bottom: 30px +.text-overflow-center + text-align: center + display: flex + justify-content: center + .simple_form @include css4 color: var(--grey) @@ -253,24 +258,6 @@ input[type=submit] margin-bottom: 3px -// jquery ui override -.ui-autocomplete - @include css4 - background: var(--input--background--focus) - border: 1px solid var(--input--border-color--focus) - color: var(--input--text--focus) - list-style: none - padding: 0 - .ui-menu-item div - padding: 2px 5px - display: block - cursor: pointer - &:hover, &.ui-state-focus - @include css4 - background: var(--primary) - @include css4 - color: var(--white) - // form wizard .wizard-stage display: none diff --git a/app/assets/stylesheets/manage.sass b/app/assets/stylesheets/manage.sass index e08c1596e..087c35ffa 100644 --- a/app/assets/stylesheets/manage.sass +++ b/app/assets/stylesheets/manage.sass @@ -3,6 +3,9 @@ @import manage/selectize-fix @import vendor/simplemde.min @import vendor/codemirror +@import general/variables +@import general/css4 +@import manage/autocomplete $grey-dark: #555 $grey-med: #999 @@ -172,6 +175,7 @@ $grey-med: #999 .sidebar-mobile .sidebar-sticky height: auto + /* * Datatable changes */ diff --git a/app/assets/stylesheets/manage/_autocomplete.sass b/app/assets/stylesheets/manage/_autocomplete.sass new file mode 100644 index 000000000..f5e716fea --- /dev/null +++ b/app/assets/stylesheets/manage/_autocomplete.sass @@ -0,0 +1,12 @@ + +@import ../forms/autocomplete + +// jquery ui override +.ui-autocomplete + background: white + border: 1px solid #333 + color: #222 + .ui-menu-item div + &:hover + background: #999 + color: white diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0e3b50bdf..00bdf3bc4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,8 +5,6 @@ def after_sign_in_path_for(resource) stored_location = stored_location_for(resource) if stored_location stored_location - elsif current_user.admin? || current_user.admin_limited_access? - manage_root_path elsif current_user.questionnaire.nil? new_questionnaires_path else diff --git a/app/controllers/manage/admins_controller.rb b/app/controllers/manage/admins_controller.rb deleted file mode 100644 index f22d6d794..000000000 --- a/app/controllers/manage/admins_controller.rb +++ /dev/null @@ -1,56 +0,0 @@ -class Manage::AdminsController < Manage::ApplicationController - before_action :find_user, only: [:show, :edit, :update, :destroy] - - respond_to :html, :json - - def index - respond_with(:manage, User.where(role: [:admin, :admin_limited_access, :event_tracking])) - end - - def datatable - render json: AdminDatatable.new(params, view_context: view_context) - end - - def show - respond_with(:manage, @user) - end - - def new - @user = ::User.new - respond_with(:manage, @user) - end - - def edit - end - - def create - @user = ::User.new(user_params.merge(password: Devise.friendly_token.first(10))) - if @user.save - @user.send_reset_password_instructions - flash[:notice] = "Created account for #{@user.email} and sent email with link to set a password" - end - respond_with(:manage, @user, location: manage_admins_path) - end - - def update - @user.update_attributes(user_params) - respond_with(:manage, @user, location: manage_admins_path) - end - - def destroy - @user.destroy - respond_with(:manage, @user, location: manage_admins_path) - end - - private - - def user_params - params.require(:user).permit( - :email, :password, :password_confirmation, :remember_me, :role, :is_active, :receive_weekly_report - ) - end - - def find_user - @user = ::User.find(params[:id]) - end -end diff --git a/app/controllers/manage/application_controller.rb b/app/controllers/manage/application_controller.rb index cced5e844..111f68f62 100644 --- a/app/controllers/manage/application_controller.rb +++ b/app/controllers/manage/application_controller.rb @@ -1,27 +1,30 @@ class Manage::ApplicationController < ApplicationController before_action :logged_in - before_action :require_admin_or_limited_admin - before_action :limit_write_access_to_admins, only: ["edit", "update", "new", "create", "destroy", "convert_to_admin", "deliver", "merge", "perform_merge", "toggle_bus_captain", "duplicate", "update_acc_status", "send_update_email", "live_preview"] + before_action :require_director_or_organizer_or_volunteer + before_action :limit_write_access_to_directors, only: ["edit", "update", "new", "create", "destroy", "deliver", "merge", "perform_merge", "toggle_bus_captain", "duplicate", "update_acc_status", "send_update_email", "live_preview"] skip_before_action :verify_authenticity_token, if: :json_request? def logged_in authenticate_user! end - def require_full_admin - return redirect_to root_path unless current_user.try(:admin?) + def require_director + return redirect_to manage_checkins_path if current_user.volunteer? + return redirect_to manage_root_path if current_user.organizer? + return redirect_to root_path unless current_user.try(:director?) end - def require_admin_or_limited_admin - return redirect_to root_path unless current_user.try(:admin?) || current_user.try(:admin_limited_access?) + def require_director_or_organizer + return redirect_to manage_checkins_path if current_user.volunteer? + return redirect_to root_path unless current_user.organizing_staff? end - def require_admin_or_limited_admin_or_event_tracking - redirect_to root_path unless current_user.try(:admin?) || current_user.try(:admin_limited_access?) || current_user.try(:event_tracking?) + def require_director_or_organizer_or_volunteer + redirect_to root_path unless current_user.staff? end - def limit_write_access_to_admins - redirect_to url_for(controller: controller_name, action: :index) unless current_user.try(:admin?) + def limit_write_access_to_directors + redirect_to url_for(controller: controller_name, action: :index) unless current_user.try(:director?) end def json_request? diff --git a/app/controllers/manage/bus_lists_controller.rb b/app/controllers/manage/bus_lists_controller.rb index a6cb83807..5307fea5a 100644 --- a/app/controllers/manage/bus_lists_controller.rb +++ b/app/controllers/manage/bus_lists_controller.rb @@ -44,10 +44,10 @@ def toggle_bus_captain is_bus_captain = params[:bus_captain] == "1" @questionnaire.update_attribute(:is_bus_captain, is_bus_captain) if @questionnaire.reload.is_bus_captain - flash[:notice] = "#{@questionnaire.full_name} has been promoted to a bus captain." + flash[:notice] = "#{@questionnaire.user.full_name} has been promoted to a bus captain." Message.queue_for_trigger("bus_list.new_captain_confirmation", @questionnaire.user.id) else - flash[:notice] = "#{@questionnaire.full_name} has been removed as a bus captain." + flash[:notice] = "#{@questionnaire.user.full_name} has been removed as a bus captain." end redirect_to [:manage, @bus_list] end diff --git a/app/controllers/manage/configs_controller.rb b/app/controllers/manage/configs_controller.rb index e5d8eedc9..e7b9884de 100644 --- a/app/controllers/manage/configs_controller.rb +++ b/app/controllers/manage/configs_controller.rb @@ -1,5 +1,5 @@ class Manage::ConfigsController < Manage::ApplicationController - before_action :limit_access_admin + before_action :require_director before_action :get_config, only: [:edit, :update, :update_only_css_variables] respond_to :html, :json @@ -69,7 +69,4 @@ def get_config end end - def limit_access_admin - redirect_to root_path unless current_user.admin? - end end diff --git a/app/controllers/manage/dashboard_controller.rb b/app/controllers/manage/dashboard_controller.rb index 75d5be460..96dcd0f65 100644 --- a/app/controllers/manage/dashboard_controller.rb +++ b/app/controllers/manage/dashboard_controller.rb @@ -1,12 +1,11 @@ class Manage::DashboardController < Manage::ApplicationController - skip_before_action :require_admin_or_limited_admin - before_action :require_admin_or_limited_admin + before_action :require_director_or_organizer def index end def map_data - @schools = School.where("questionnaire_count", 1..Float::INFINITY).select([:city, :state, :questionnaire_count]) + @schools = School.where("questionnaire_count", 1..Float::INFINITY).select([:name, :address, :city, :state, :questionnaire_count]) end def todays_activity_data diff --git a/app/controllers/manage/data_exports_controller.rb b/app/controllers/manage/data_exports_controller.rb index a20b89db8..4142d1d9d 100644 --- a/app/controllers/manage/data_exports_controller.rb +++ b/app/controllers/manage/data_exports_controller.rb @@ -1,6 +1,5 @@ class Manage::DataExportsController < Manage::ApplicationController - skip_before_action :require_admin_or_limited_admin - before_action :require_full_admin + before_action :require_director before_action :set_data_export, only: [:destroy] diff --git a/app/controllers/manage/messages_controller.rb b/app/controllers/manage/messages_controller.rb index 245e2b07f..e84908fd4 100644 --- a/app/controllers/manage/messages_controller.rb +++ b/app/controllers/manage/messages_controller.rb @@ -1,7 +1,8 @@ class Manage::MessagesController < Manage::ApplicationController + before_action :require_director_or_organizer before_action :set_message, only: [:show, :edit, :update, :destroy, :deliver, :preview, :duplicate] before_action :check_message_access, only: [:edit, :update, :destroy] - before_action :limit_template_access_to_admins, only: [:template, :template_preview, :template_update, :template_replace_with_default] + before_action :limit_template_access_to_directors, only: [:template, :template_preview, :template_update, :template_replace_with_default] respond_to :html, :json @@ -106,9 +107,9 @@ def template_replace_with_default private - def limit_template_access_to_admins + def limit_template_access_to_directors # From Manage::ApplicationController - limit_write_access_to_admins + limit_write_access_to_directors end def message_params diff --git a/app/controllers/manage/questionnaires_controller.rb b/app/controllers/manage/questionnaires_controller.rb index f10c75129..ce2ed1218 100644 --- a/app/controllers/manage/questionnaires_controller.rb +++ b/app/controllers/manage/questionnaires_controller.rb @@ -1,8 +1,7 @@ class Manage::QuestionnairesController < Manage::ApplicationController include QuestionnairesControllable - before_action :ensure_registration_is_open, only: [:new, :create] - before_action :set_questionnaire, only: [:show, :edit, :update, :destroy, :check_in, :convert_to_admin, :update_acc_status, :message_events] + before_action :set_questionnaire, only: [:show, :edit, :update, :destroy, :check_in, :update_acc_status] respond_to :html, :json @@ -52,6 +51,12 @@ def create def update update_params = questionnaire_params email = update_params.delete(:email) + # Take our nested user object out as a whole + user_params = params[:questionnaire][:user] + if user_params + @questionnaire.user.update_attributes(first_name: user_params[:first_name]) + @questionnaire.user.update_attributes(last_name: user_params[:last_name]) + end @questionnaire.user.update_attributes(email: email) if email.present? update_params = convert_school_name_to_id(update_params) update_params = convert_boarded_bus_param(update_params, @questionnaire) @@ -77,11 +82,11 @@ def check_in end @questionnaire.update_attribute(:checked_in_at, Time.now) @questionnaire.update_attribute(:checked_in_by_id, current_user.id) - flash[:notice] = "Checked in #{@questionnaire.full_name}." + flash[:notice] = "Checked in #{@questionnaire.user.full_name}." elsif params[:check_in] == "false" @questionnaire.update_attribute(:checked_in_at, nil) @questionnaire.update_attribute(:checked_in_by_id, current_user.id) - flash[:notice] = "#{@questionnaire.full_name} no longer checked in." + flash[:notice] = "#{@questionnaire.user.full_name} no longer checked in." else flash[:alert] = "No check-in action provided!" redirect_to show_redirect_path @@ -90,17 +95,15 @@ def check_in redirect_to index_redirect_path end - def convert_to_admin - user = @questionnaire.user - @questionnaire.destroy - user.update_attributes(role: :admin) - redirect_to edit_manage_admin_path(user) - end - def destroy - user = @questionnaire.user + if @questionnaire.is_bus_captain + directors = User.where(role: :director) + directors.each do |user| + StaffMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later + end + end + @questionnaire.destroy - user.destroy if user.present? respond_with(:manage, @questionnaire) end @@ -141,15 +144,13 @@ def bulk_apply head :ok end - def message_events - render json: @questionnaire.message_events - end - private def questionnaire_params + # Note that this ONLY considers parameters for the questionnaire, not the user. + # TODO: Refactor "email" out to user as first_name and last_name were params.require(:questionnaire).permit( - :email, :experience, :first_name, :last_name, :gender, + :email, :experience, :gender, :date_of_birth, :interest, :school_id, :school_name, :major, :level_of_study, :shirt_size, :dietary_restrictions, :special_needs, :international, :portfolio_url, :vcs_url, :agreement_accepted, :bus_captain_interest, @@ -170,11 +171,4 @@ def convert_boarded_bus_param(values, questionnaire = nil) def set_questionnaire @questionnaire = ::Questionnaire.find(params[:id]) end - - def ensure_registration_is_open - if HackathonConfig['disable_account_registration'] - flash[:alert] = "Registration has closed" - redirect_to root_path - end - end end diff --git a/app/controllers/manage/stats_controller.rb b/app/controllers/manage/stats_controller.rb index c4958d6cf..5426424e1 100644 --- a/app/controllers/manage/stats_controller.rb +++ b/app/controllers/manage/stats_controller.rb @@ -1,137 +1,26 @@ class Manage::StatsController < Manage::ApplicationController - def index - end + before_action :require_director_or_organizer - def dietary_special_needs - data = Rails.cache.fetch(cache_key_for_questionnaires("dietary_special_needs")) do - select_attributes = [ - :first_name, - :last_name, - :phone, - :checked_in_at, - :dietary_restrictions, - :special_needs, - :user_id - ] - json_attributes = [ - :first_name, - :last_name, - :email, - :phone, - :checked_in_at, - :dietary_restrictions, - :special_needs - ] - data = Questionnaire.where("dietary_restrictions != '' AND acc_status = 'rsvp_confirmed' OR special_needs != '' AND acc_status = 'rsvp_confirmed'").select(select_attributes) - to_json_array(data, json_attributes) - end - render json: { data: data } - end + respond_to :html, :json - def sponsor_info - data = Rails.cache.fetch(cache_key_for_questionnaires("sponsor_info")) do - select_attributes = [ - :id, - :first_name, - :last_name, - :vcs_url, - :portfolio_url, - :user_id, - :school_id - ] - json_attributes = [ - :first_name, - :last_name, - :email, - :school_name, - :vcs_url, - :portfolio_url - ] - data = Questionnaire.where("can_share_info = '1' AND checked_in_at != 0").joins(:resume_attachment).select(select_attributes) - json = to_json_array(data, json_attributes) - json.map.with_index { |item, index| item.insert(6, data[index].resume.attached? ? url_for(data[index].resume) : '') } - end - render json: { data: data } + def dietary_restrictions_special_needs_datatable + render json: DietarySpecialNeedsDatatable.new(params, view_context: view_context) end - def alt_travel - data = Rails.cache.fetch(cache_key_for_questionnaires("alt_travel")) do - select_attributes = [ - :id, - :first_name, - :last_name, - :travel_location, - :acc_status, - :user_id, - :school_id - ] - json_attributes = [ - :id, - :first_name, - :last_name, - :email, - :travel_location, - :acc_status - ] - data = Questionnaire.where("travel_not_from_school = '1'").select(select_attributes) - json = to_json_array(data, json_attributes) - json.each do |e| - e[0] = view_context.link_to("View »".html_safe, manage_questionnaire_path(e[0])) - end - end - render json: { data: data } + def alt_travel_datatable + render json: AltTravelDatatable.new(params, view_context: view_context) end - def mlh_info_applied - data = Rails.cache.fetch(cache_key_for_questionnaires("mlh_info_applied")) do - select_attributes = [ - :first_name, - :last_name, - :user_id, - :school_id - ] - json_attributes = [ - :first_name, - :last_name, - :email, - :school_name - ] - data = Questionnaire.joins(:school).select(select_attributes) - to_json_array(data, json_attributes) - end - render json: { data: data } + def attendee_sponsor_info_datatable + render json: AttendeeSponsorInfoDatatable.new(params, view_context: view_context) end - def mlh_info_checked_in - data = Rails.cache.fetch(cache_key_for_questionnaires("mlh_info_checked_in")) do - select_attributes = [ - :first_name, - :last_name, - :user_id, - :school_id - ] - json_attributes = [ - :first_name, - :last_name, - :email, - :school_name - ] - data = Questionnaire.joins(:school).select(select_attributes).where('checked_in_at > 0') - to_json_array(data, json_attributes) - end - render json: { data: data } + def mlh_applied_datatable + render json: MLHAppliedDatatable.new(params, view_context: view_context) end - - private - - def to_json_array(data, attributes) - data.map { |e| attributes.map { |a| e.send(a) } } + def mlh_checked_in_datatable + render json: MLHCheckedInDatatable.new(params, view_context: view_context) end - def cache_key_for_questionnaires(id) - count = Questionnaire.count - max_updated_at = Questionnaire.maximum(:updated_at).try(:utc).try(:to_s, :number) - "stats/all-#{count}-#{max_updated_at}-#{id}" - end end diff --git a/app/controllers/manage/trackable_events_controller.rb b/app/controllers/manage/trackable_events_controller.rb index 1bd812fb5..28cb7059b 100644 --- a/app/controllers/manage/trackable_events_controller.rb +++ b/app/controllers/manage/trackable_events_controller.rb @@ -1,9 +1,6 @@ class Manage::TrackableEventsController < Manage::ApplicationController - skip_before_action :require_admin_or_limited_admin - before_action :require_admin_or_limited_admin_or_event_tracking - before_action :set_trackable_event, only: [:show, :edit, :update, :destroy] - before_action :scope_limited_admin_access, only: [:edit, :update, :destroy] + before_action :scope_organizer_access, only: [:edit, :update, :destroy] respond_to :html, :json @@ -81,13 +78,13 @@ def trackable_event_params params.require(:trackable_event).permit(:band_id, :trackable_tag_id) end - # Permit limited-access admins (overrides Manage::ApplicationController#limit_write_access_to_admins) - def limit_write_access_to_admins + # Permit limited-access directors (overrides Manage::ApplicationController#limit_write_access_to_directors) + def limit_write_access_to_directors end - # If the user isn't a full admin, scope changes only to those they created - def scope_limited_admin_access - return if current_user.admin? || @trackable_event.blank? || @trackable_event.user.blank? + # If the user isn't a director, scope changes only to those they created + def scope_organizer_access + return if current_user.director? || @trackable_event.blank? || @trackable_event.user.blank? redirect_to manage_trackable_events_path, notice: 'You may not view events you did not create.' if @trackable_event.user != current_user end end diff --git a/app/controllers/manage/trackable_tags_controller.rb b/app/controllers/manage/trackable_tags_controller.rb index 525643772..852ea9f5d 100644 --- a/app/controllers/manage/trackable_tags_controller.rb +++ b/app/controllers/manage/trackable_tags_controller.rb @@ -1,7 +1,4 @@ class Manage::TrackableTagsController < Manage::ApplicationController - skip_before_action :require_admin_or_limited_admin - before_action :require_admin_or_limited_admin_or_event_tracking - before_action :set_trackable_tag, only: [:show, :edit, :update, :destroy] respond_to :html, :json diff --git a/app/controllers/manage/users_controller.rb b/app/controllers/manage/users_controller.rb new file mode 100644 index 000000000..e5d743166 --- /dev/null +++ b/app/controllers/manage/users_controller.rb @@ -0,0 +1,48 @@ +class Manage::UsersController < Manage::ApplicationController + before_action :require_director + before_action :find_user, only: [:show, :edit, :update, :destroy] + + respond_to :html, :json + + def index + respond_with(:manage, User.where(role: [:director, :organizer, :volunteer])) + end + + def user_datatable + render json: UserDatatable.new(params, view_context: view_context) + end + + def staff_datatable + render json: StaffDatatable.new(params, view_context: view_context) + end + + def show + respond_with(:manage, @user) + end + + def edit + end + + def update + @user.update_attributes(user_params) + respond_with(:manage, @user, location: manage_users_path) + end + + def destroy + if @user.questionnaire.present? + @user.questionnaire.destroy + end + @user.destroy + respond_with(:manage, @user, location: manage_users_path) + end + + def user_params + params.require(:user).permit( + :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :role, :is_active, :receive_weekly_report + ) + end + + def find_user + @user = ::User.find(params[:id]) + end +end diff --git a/app/controllers/questionnaires_controller.rb b/app/controllers/questionnaires_controller.rb index b1e592452..3cb3763b6 100644 --- a/app/controllers/questionnaires_controller.rb +++ b/app/controllers/questionnaires_controller.rb @@ -26,18 +26,14 @@ def new @questionnaire = Questionnaire.new if session["devise.provider_data"] && session["devise.provider_data"]["info"] + info = session["devise.provider_data"]["info"] @skip_my_mlh_fields = true @questionnaire.tap do |q| - q.first_name = session["devise.provider_data"]["info"]["first_name"] - q.last_name = session["devise.provider_data"]["info"]["last_name"] - q.phone = session["devise.provider_data"]["info"]["phone_number"] - q.level_of_study = session["devise.provider_data"]["info"]["level_of_study"] - q.major = session["devise.provider_data"]["info"]["major"] - q.date_of_birth = session["devise.provider_data"]["info"]["date_of_birth"] - q.shirt_size = session["devise.provider_data"]["info"]["shirt_size"] - q.dietary_restrictions = session["devise.provider_data"]["info"]["dietary_restrictions"] - q.special_needs = session["devise.provider_data"]["info"]["special_needs"] - q.gender = session["devise.provider_data"]["info"]["gender"] + q.phone = info["phone_number"] + q.level_of_study = info["level_of_study"] + q.major = info["major"] + q.date_of_birth = info["date_of_birth"] + q.gender = info["gender"] school = School.where(name: session["devise.provider_data"]["info"]["school"]["name"]).first_or_create do |s| s.name = session["devise.provider_data"]["info"]["school"]["name"] @@ -62,6 +58,7 @@ def create if current_user.reload.questionnaire.present? return redirect_to questionnaires_path, notice: 'Application already exists.' end + return unless HackathonConfig['accepting_questionnaires'] @questionnaire = Questionnaire.new(convert_school_name_to_id(questionnaire_params)) @questionnaire.user_id = current_user.id @@ -97,8 +94,14 @@ def update # DELETE /apply # DELETE /apply.json def destroy - @questionnaire.destroy + if @questionnaire.is_bus_captain + directors = User.where(role: :director) + directors.each do |user| + StaffMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later + end + end + @questionnaire.destroy respond_to do |format| format.html { redirect_to questionnaires_url } format.json { head :no_content } @@ -119,7 +122,7 @@ def schools def questionnaire_params params.require(:questionnaire).permit( - :email, :experience, :first_name, :last_name, :gender, + :email, :experience, :gender, :date_of_birth, :interest, :school_id, :school_name, :major, :level_of_study, :shirt_size, :dietary_restrictions, :special_needs, :international, :portfolio_url, :vcs_url, :agreement_accepted, :bus_captain_interest, diff --git a/app/controllers/rsvps_controller.rb b/app/controllers/rsvps_controller.rb index 82d9f0e2d..85a61defd 100644 --- a/app/controllers/rsvps_controller.rb +++ b/app/controllers/rsvps_controller.rb @@ -43,6 +43,10 @@ def deny # rubocop:disable CyclomaticComplexity # rubocop:disable PerceivedComplexity def update + # save to check if bus status changes after rsvp + bus = @questionnaire.bus_list_id + acc_status = @questionnaire.acc_status + unless @questionnaire.update_attributes(params.require(:questionnaire).permit(:agreement_accepted, :phone)) flash[:alert] = @questionnaire.errors.full_messages.join(", ") redirect_to rsvp_path @@ -55,22 +59,18 @@ def update return end - @questionnaire.acc_status_date = Time.now if @questionnaire.acc_status != params[:questionnaire][:acc_status] - @questionnaire.acc_status = params[:questionnaire][:acc_status] - @questionnaire.acc_status_author_id = current_user.id + update_acc_status + update_bus_list - new_bus_list_id = params[:questionnaire][:bus_list_id].presence - new_bus_list = new_bus_list_id && BusList.find(new_bus_list_id) - is_joining_bus = new_bus_list.present? && @questionnaire.bus_list != new_bus_list - if is_joining_bus && new_bus_list.full? - if @questionnaire.bus_list_id? - flash[:alert] = "Sorry, that bus is full. You are still signed up for the '#{@questionnaire.bus_list.name}' bus." - else - flash[:alert] = "Sorry, that bus is full. You may need to arrange other plans for transportation." + bus_after_rsvp = @questionnaire.bus_list_id + acc_status_after_rsvp = @questionnaire.acc_status + + if bus != nil && (acc_status != acc_status_after_rsvp || bus != bus_after_rsvp) && @questionnaire.is_bus_captain == true + @questionnaire.is_bus_captain = false + directors = User.where(role: :director) + directors.each do |user| + StaffMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later end - else - @questionnaire.bus_list = new_bus_list - @questionnaire.bus_captain_interest = params[:questionnaire][:bus_captain_interest] end unless @questionnaire.save @@ -91,6 +91,28 @@ def update private + def update_acc_status + @questionnaire.acc_status_date = Time.now if @questionnaire.acc_status != params[:questionnaire][:acc_status] + @questionnaire.acc_status = params[:questionnaire][:acc_status] + @questionnaire.acc_status_author_id = current_user.id + end + + def update_bus_list + new_bus_list_id = params[:questionnaire][:bus_list_id].presence + new_bus_list = new_bus_list_id && BusList.find(new_bus_list_id) + is_joining_bus = new_bus_list.present? && @questionnaire.bus_list != new_bus_list + if is_joining_bus && new_bus_list.full? + if @questionnaire.bus_list_id? + flash[:alert] = "Sorry, that bus is full. You are still signed up for the '#{@questionnaire.bus_list.name}' bus." + else + flash[:alert] = "Sorry, that bus is full. You may need to arrange other plans for transportation." + end + else + @questionnaire.bus_list = new_bus_list + @questionnaire.bus_captain_interest = params[:questionnaire][:bus_captain_interest] + end + end + def rsvp_error_notice hackathon_name = HackathonConfig['name'] "There was an error submitting your response, please check over your application and try again. Did you accept the #{hackathon_name} Agreement?" diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index bdc1eaf7c..51d7ecf9b 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -4,7 +4,7 @@ def mlh if @user.persisted? sign_in_and_redirect @user, event: :authentication # this will throw if @user is not activated session["devise.provider_data"] = request.env["omniauth.auth"] - set_flash_message(:notice, :success, kind: "My MLH") if is_navigational_format? + set_flash_message(:notice, :success, kind: "MyMLH") if is_navigational_format? else redirect_to new_user_registration_url end diff --git a/app/controllers/users/registrations_controller.rb b/app/controllers/users/registrations_controller.rb index aa1766d7b..a19263901 100644 --- a/app/controllers/users/registrations_controller.rb +++ b/app/controllers/users/registrations_controller.rb @@ -1,15 +1,10 @@ class Users::RegistrationsController < Devise::RegistrationsController - # before_action :configure_sign_up_params, only: [:create] - # before_action :configure_account_update_params, only: [:update] + before_action :configure_sign_up_params, only: [:create] + before_action :configure_account_update_params, only: [:update] # GET /resource/sign_up def new - if HackathonConfig['disable_account_registration'] - flash[:alert] = "Registration has closed" - redirect_to root_path - else - super - end + super end # POST /resource @@ -33,6 +28,17 @@ def destroy super end + # Permit adding custom parameters for sign up + # (Devise gives us email and password by default, but we want some more.) + def configure_sign_up_params + devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name]) + end + + # Permit updating custom parameters for sign up + def configure_account_update_params + devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name]) + end + # GET /resource/cancel # Forces the session data which is usually expired after sign # in to be expired now. This is useful if the user wants to @@ -44,16 +50,6 @@ def destroy # protected - # You can put the params you want to permit in the empty array. - # def configure_sign_up_params - # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute]) - # end - - # You can put the params you want to permit in the empty array. - # def configure_account_update_params - # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute]) - # end - # The path used after sign up. # def after_sign_up_path_for(resource) # super(resource) diff --git a/app/datatables/alt_travel_datatable.rb b/app/datatables/alt_travel_datatable.rb new file mode 100644 index 000000000..1879b80ee --- /dev/null +++ b/app/datatables/alt_travel_datatable.rb @@ -0,0 +1,45 @@ +class AltTravelDatatable < ApplicationDatatable + def_delegators :@view, :link_to, :manage_stats_path, :manage_questionnaire_path, :bold, :display_datetime + + def view_columns + @view_columns ||= { + id: { source: "Questionnaire.id" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, + email: { source: "User.email" }, + phone: { source: "Questionnaire.phone" }, + travel_location: { source: "Questionnaire.travel_location" }, + acc_status: { source: "Questionnaire.acc_status" } + } + end + + private + + def data + records.map do |record| + { + id: record.id, + first_name: record.user.first_name, + last_name: record.user.last_name, + email: record.user.email, + phone: record.phone, + questionnaire: link_to(bold("View »".html_safe), manage_questionnaire_path(record.id)), + travel_location: record.travel_location, + acc_status: record.acc_status + } + end + end + + def get_raw_records + restrictions = "travel_not_from_school = '1'" + + q_attributes = [ + :id, + :phone, + :travel_location, + :acc_status + ] + + Questionnaire.includes(:user).references(:user).where(restrictions).select(q_attributes) + end +end diff --git a/app/datatables/attendee_sponsor_info_datatable.rb b/app/datatables/attendee_sponsor_info_datatable.rb new file mode 100644 index 000000000..d22e062ce --- /dev/null +++ b/app/datatables/attendee_sponsor_info_datatable.rb @@ -0,0 +1,44 @@ +class AttendeeSponsorInfoDatatable < ApplicationDatatable + def_delegators :@view, :link_to, :manage_stats_path, :manage_questionnaire_path, :bold, :display_datetime + + def view_columns + @view_columns ||= { + id: { source: "Questionnaire.id" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, + email: { source: "User.email" }, + school_name: { source: "School.name" }, + vcs_url: { source: "Questionnaire.vcs_url" }, + portfolio_url: { source: "Questionnaire.portfolio_url" } + } + end + + private + + def data + records.map do |record| + { + id: record.id, + first_name: record.user.first_name, + last_name: record.user.last_name, + email: record.user.email, + school_name: record.school_name, + vcs_url: record.vcs_url, + portfolio_url: record.portfolio_url + } + end + end + + def get_raw_records + # Condition: only retrieve users that have agreed to share data and are at the event + restrictions = "can_share_info = '1' AND checked_in_at != 0" + + q_attributes = [ + :id, + :vcs_url, + :portfolio_url + ] + + Questionnaire.includes(:user).references(:user).where(restrictions).select(q_attributes) + end +end diff --git a/app/datatables/checkin_datatable.rb b/app/datatables/checkin_datatable.rb index 0b2344382..f3443fe8e 100644 --- a/app/datatables/checkin_datatable.rb +++ b/app/datatables/checkin_datatable.rb @@ -3,8 +3,8 @@ class CheckinDatatable < ApplicationDatatable def view_columns @view_columns ||= { - first_name: { source: "Questionnaire.first_name" }, - last_name: { source: "Questionnaire.last_name" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, checked_in: { source: "Questionnaire.checked_in_at", searchable: false }, } end @@ -13,7 +13,7 @@ def view_columns def about(record) output = "" - output += [record.first_name, record.last_name].join(" ") + " " + output += [record.user.first_name, record.user.last_name].join(" ") + " " output += 'Minor' if record.minor? output += "
" + record.school.name + "" output.html_safe @@ -22,8 +22,8 @@ def about(record) def data records.map do |record| { - first_name: record.first_name, - last_name: record.last_name, + first_name: record.user.first_name, + last_name: record.user.last_name, about: about(record), checked_in: yes_no_display(record.checked_in?), actions: "View".html_safe, diff --git a/app/datatables/dietary_special_needs_datatable.rb b/app/datatables/dietary_special_needs_datatable.rb new file mode 100644 index 000000000..b9f174a66 --- /dev/null +++ b/app/datatables/dietary_special_needs_datatable.rb @@ -0,0 +1,50 @@ +class DietarySpecialNeedsDatatable < ApplicationDatatable + def_delegators :@view, :link_to, :manage_stats_path, :manage_questionnaire_path, :bold, :display_datetime + + def view_columns + @view_columns ||= { + id: { source: "Questionnaire.id" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, + email: { source: "User.email" }, + phone: { source: "Questionnaire.phone" }, + checked_in_at: { source: "Questionnaire.checked_in_at", searchable: false }, + dietary_restrictions: { source: "Questionnaire.dietary_restrictions" }, + special_needs: { source: "Questionnaire.special_needs" } + } + end + + private + + def data + records.map do |record| + { + id: record.id, + first_name: record.user.first_name, + last_name: record.user.last_name, + email: record.user.email, + phone: record.phone, + questionnaire: link_to(bold("View »".html_safe), manage_questionnaire_path(record.id)), + checked_in_at: record.checked_in_at, + dietary_restrictions: record.dietary_restrictions, + special_needs: record.special_needs + } + end + end + + def get_raw_records + # Condition: only retrieve users that have dietary restrictions or special dietary needs + restrictions = "acc_status = 'rsvp_confirmed' AND "\ + "dietary_restrictions != '' OR special_needs != ''" + + q_attributes = [ + :id, + :phone, + :checked_in_at, + :dietary_restrictions, + :special_needs + ] + + Questionnaire.includes(:user).references(:user).where(restrictions).select(q_attributes) + end +end diff --git a/app/datatables/mlh_applied_datatable.rb b/app/datatables/mlh_applied_datatable.rb new file mode 100644 index 000000000..7da2d25c4 --- /dev/null +++ b/app/datatables/mlh_applied_datatable.rb @@ -0,0 +1,38 @@ +class MLHAppliedDatatable < ApplicationDatatable + def_delegators :@view, :link_to, :manage_stats_path, :bold, :display_datetime + + def view_columns + @view_columns ||= { + id: { source: "Questionnaire.id" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, + email: { source: "User.email" }, + phone: { source: "Questionnaire.phone" }, + school_name: { source: "School.name" } + } + end + + private + + def data + records.map do |record| + { + id: record.id, + first_name: record.user.first_name, + last_name: record.user.last_name, + email: record.user.email, + phone: record.phone, + school_name: record.school_name + } + end + end + + def get_raw_records + q_attributes = [ + :id, + :phone + ] + + Questionnaire.includes(:user).references(:user).select(q_attributes) + end +end diff --git a/app/datatables/mlh_checked_in_datatable.rb b/app/datatables/mlh_checked_in_datatable.rb new file mode 100644 index 000000000..7524b2c01 --- /dev/null +++ b/app/datatables/mlh_checked_in_datatable.rb @@ -0,0 +1,40 @@ +class MLHCheckedInDatatable < ApplicationDatatable + def_delegators :@view, :link_to, :manage_stats_path, :bold, :display_datetime + + def view_columns + @view_columns ||= { + id: { source: "Questionnaire.id" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, + email: { source: "User.email" }, + phone: { source: "Questionnaire.phone" }, + school_name: { source: "School.name" } + } + end + + private + + def data + records.map do |record| + { + id: record.id, + first_name: record.user.first_name, + last_name: record.user.last_name, + email: record.user.email, + phone: record.phone, + school_name: record.school_name + } + end + end + + def get_raw_records + restrictions = "checked_in_at > 0" + + q_attributes = [ + :id, + :phone + ] + + Questionnaire.includes(:user).references(:user).where(restrictions).select(q_attributes) + end +end diff --git a/app/datatables/questionnaire_datatable.rb b/app/datatables/questionnaire_datatable.rb index a9abbf6ec..6ff70041c 100644 --- a/app/datatables/questionnaire_datatable.rb +++ b/app/datatables/questionnaire_datatable.rb @@ -4,8 +4,8 @@ class QuestionnaireDatatable < ApplicationDatatable def view_columns @view_columns ||= { id: { source: "Questionnaire.id", cond: :eq }, - first_name: { source: "Questionnaire.first_name" }, - last_name: { source: "Questionnaire.last_name" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, email: { source: "User.email" }, phone: { source: "Questionnaire.phone" }, gender: { source: "Questionnaire.gender" }, @@ -35,24 +35,24 @@ def note(record) def bus_captain(record) return "No" unless record.bus_list_id? - return record.is_bus_captain? ? 'Yes' : "No" unless current_user.admin? + return record.is_bus_captain? ? 'Yes' : "No" unless current_user.director? if record.is_bus_captain? link_to("Remove", toggle_bus_captain_manage_bus_list_path(record.bus_list_id, questionnaire_id: record.id, bus_captain: "0"), method: "post", class: "text-danger") else - link_to("Promote", toggle_bus_captain_manage_bus_list_path(record.bus_list_id, questionnaire_id: record.id, bus_captain: "1"), method: "post", data: { confirm: "Are you sure you want to make #{record.full_name} a bus captain? They will receive a confirmation email." }) + link_to("Promote", toggle_bus_captain_manage_bus_list_path(record.bus_list_id, questionnaire_id: record.id, bus_captain: "1"), method: "post", data: { confirm: "Are you sure you want to make #{record.user.full_name} a bus captain? They will receive a confirmation email." }) end end def data records.map do |record| { - bulk: current_user.admin? ? "".html_safe : "", + bulk: current_user.director? ? "".html_safe : "", link: link_to(''.html_safe, manage_questionnaire_path(record)), note: note(record), id: record.id, - first_name: bold(record.first_name), - last_name: bold(record.last_name), + first_name: bold(record.user.first_name), + last_name: bold(record.user.last_name), email: record.email, phone: record.phone, gender: record.gender, diff --git a/app/datatables/admin_datatable.rb b/app/datatables/staff_datatable.rb similarity index 77% rename from app/datatables/admin_datatable.rb rename to app/datatables/staff_datatable.rb index 62bdea5f5..01c39c922 100644 --- a/app/datatables/admin_datatable.rb +++ b/app/datatables/staff_datatable.rb @@ -1,9 +1,11 @@ -class AdminDatatable < ApplicationDatatable - def_delegators :@view, :link_to, :manage_admin_path, :bold, :display_datetime +class StaffDatatable < ApplicationDatatable + def_delegators :@view, :link_to, :manage_user_path, :bold, :display_datetime def view_columns @view_columns ||= { id: { source: "User.id" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, email: { source: "User.email" }, role: { source: "User.role", searchable: false }, active: { source: "User.is_active", searchable: false }, @@ -23,7 +25,10 @@ def data records.map do |record| { id: record.id, - email: link_to(bold(record.email), manage_admin_path(record)), + link: link_to(''.html_safe, manage_user_path(record)), + first_name: record.first_name, + last_name: record.last_name, + email: record.email, role: record.role.titleize, active: record.is_active ? 'Active'.html_safe : 'Inactive'.html_safe, receive_weekly_report: yes_no_display(record.receive_weekly_report), @@ -38,6 +43,6 @@ def data end def get_raw_records - User.where(role: [:admin, :admin_limited_access, :event_tracking]) + User.where(role: [:director, :organizer, :volunteer]) end end diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb new file mode 100644 index 000000000..b442700dd --- /dev/null +++ b/app/datatables/user_datatable.rb @@ -0,0 +1,47 @@ +class UserDatatable < ApplicationDatatable + def_delegators :@view, :link_to, :manage_user_path, :manage_questionnaire_path, :bold, :display_datetime + + def view_columns + @view_columns ||= { + id: { source: "User.id" }, + first_name: { source: "User.first_name" }, + last_name: { source: "User.last_name" }, + email: { source: "User.email" }, + role: { source: "User.role", searchable: false }, + active: { source: "User.is_active", searchable: false }, + created_at: { source: "User.created_at", searchable: false }, + current_sign_in_at: { source: "User.current_sign_in_at", searchable: false }, + last_sign_in_at: { source: "User.last_sign_in_at", searchable: false }, + current_sign_in_ip: { source: "User.current_sign_in_ip" }, + last_sign_in_ip: { source: "User.last_sign_in_ip" }, + sign_in_count: { source: "User.sign_in_count", searchable: false }, + } + end + + private + + def data + records.map do |record| + { + id: record.id, + link: link_to(''.html_safe, manage_user_path(record)), + first_name: record.first_name, + last_name: record.last_name, + email: link_to(bold(record.email), manage_user_path(record)), + role: record.role.titleize, + questionnaire: record.questionnaire.present? ? link_to(bold("View »".html_safe), manage_questionnaire_path(record.questionnaire.id)) : 'None', + active: record.is_active ? 'Active'.html_safe : 'Inactive'.html_safe, + created_at: display_datetime(record.created_at), + current_sign_in_at: display_datetime(record.current_sign_in_at), + last_sign_in_at: display_datetime(record.last_sign_in_at), + current_sign_in_ip: record.current_sign_in_ip == "::1" ? "127.0.0.1" : record.current_sign_in_ip, + last_sign_in_ip: record.last_sign_in_ip == "::1" ? "127.0.0.1" : record.last_sign_in_ip, + sign_in_count: record.sign_in_count, + } + end + end + + def get_raw_records + User.all + end +end diff --git a/app/jobs/bulk_message_job.rb b/app/jobs/bulk_message_job.rb index 2989e6564..3af60748e 100644 --- a/app/jobs/bulk_message_job.rb +++ b/app/jobs/bulk_message_job.rb @@ -27,11 +27,11 @@ def self.build_recipients(recipient_types) def self.user_ids(type) case type when "all" - # Everyone, including admins that completed a questionnaire - User.non_admins.pluck(:id) + Questionnaire.pluck(:user_id) + # Everyone, including organizers that completed a questionnaire + User.non_organizer.pluck(:id) + Questionnaire.pluck(:user_id) when "incomplete" - # Incomplete applications, excluding admins that don't have a questionnaire - User.non_admins.pluck(:id) - Questionnaire.pluck(:user_id) + # Incomplete applications, excluding organizers that don't have a questionnaire + User.non_organizer.pluck(:id) - Questionnaire.pluck(:user_id) when "complete" Questionnaire.pluck(:user_id) when "accepted" diff --git a/app/jobs/admin_weekly_report_job.rb b/app/jobs/staff_weekly_report_job.rb similarity index 71% rename from app/jobs/admin_weekly_report_job.rb rename to app/jobs/staff_weekly_report_job.rb index 5c3f7b0c5..5e78e0fa7 100644 --- a/app/jobs/admin_weekly_report_job.rb +++ b/app/jobs/staff_weekly_report_job.rb @@ -1,11 +1,11 @@ -class AdminWeeklyReportJob < ApplicationJob +class StaffWeeklyReportJob < ApplicationJob queue_as :default def perform # Queue all eligible users and let the is_active (or other) logic determine if they should really receive it users = User.where(receive_weekly_report: true) users.each do |user| - AdminMailer.weekly_report(user.id).deliver_later + StaffMailer.weekly_report(user.id).deliver_later end end end diff --git a/app/mailers/mail_preview.rb b/app/mailers/mail_preview.rb index d29bda648..18d63abf8 100644 --- a/app/mailers/mail_preview.rb +++ b/app/mailers/mail_preview.rb @@ -5,8 +5,8 @@ def bulk_message_email UserMailer.bulk_message_email(message, User.first.id) end - def admin_weekly_report - AdminMailer.weekly_report(User.first.id) + def staff_weekly_report + StaffMailer.weekly_report(User.first.id) end end end diff --git a/app/mailers/admin_mailer.rb b/app/mailers/staff_mailer.rb similarity index 79% rename from app/mailers/admin_mailer.rb rename to app/mailers/staff_mailer.rb index 2fd2d8bb6..5c08c4cd9 100644 --- a/app/mailers/admin_mailer.rb +++ b/app/mailers/staff_mailer.rb @@ -1,8 +1,8 @@ -class AdminMailer < ApplicationMailer +class StaffMailer < ApplicationMailer include Roadie::Rails::Automatic add_template_helper(HackathonManagerHelper) - layout "admin_mailer" + layout "staff_mailer" def weekly_report(user_id) # Don't send emails more than 7 days after event starts @@ -42,6 +42,17 @@ def weekly_report(user_id) ) end + def bus_captain_left(bus_list_id, former_captain_id, user_id) + @bus_route = BusList.find_by_id(bus_list_id) + @former_captain = User.find_by_id(former_captain_id) + @user = User.find_by_id(user_id) + + mail( + to: pretty_email(@user.full_name, @user.email), + subject: "Bus Captain Left Bus Route: " + @bus_route.name, + ) + end + private def report_metric(query_base, new_query_field) diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 869c58a78..ef1d03cf2 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -16,15 +16,15 @@ def bulk_message_email(message_id, user_id, message = nil, use_examples = false) def incomplete_reminder_email(user_id) @user = User.find_by_id(user_id) - return if @user.blank? || @user.admin? || @user.questionnaire || Time.now.to_date > Date.parse(HackathonConfig["last_day_to_apply"]) + return if @user.blank? || @user.director? || @user.questionnaire || Time.now.in_time_zone.to_date > Date.parse(HackathonConfig["last_day_to_apply"]).in_time_zone.to_date Message.queue_for_trigger("user.24hr_incomplete_application", @user.id) end - rescue_from SparkPostRails::DeliveryException do |e| - error_codes_to_not_retry = [ - "1902", # Generation rejection, specific to the Sparkpost API - ] - raise e unless e.blank? || error_codes_to_not_retry.include?(e.service_code) + def rsvp_reminder_email(user_id) + @user = User.find_by_id(user_id) + return if @user.blank? || !@user.questionnaire.acc_status == "accepted" || Time.now.in_time_zone.to_date > Date.parse(HackathonConfig["event_start_date"]).in_time_zone.to_date + + Message.queue_for_trigger("questionnaire.rsvp_reminder", @user.id) end end diff --git a/app/models/bus_list.rb b/app/models/bus_list.rb index c5d8c6036..72c0e549b 100644 --- a/app/models/bus_list.rb +++ b/app/models/bus_list.rb @@ -13,7 +13,7 @@ def full? end def passengers - questionnaires.where("acc_status = 'rsvp_confirmed'").order("last_name ASC") + questionnaires.where("acc_status = 'rsvp_confirmed'") end def schools diff --git a/app/models/message.rb b/app/models/message.rb index f98ee83bf..a25dfec09 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -37,6 +37,7 @@ class Message < ApplicationRecord "questionnaire.late_waitlist" => "Questionnaire Status: Waitlisted, Late", "questionnaire.rsvp_confirmed" => "Questionnaire Status: RSVP Confirmed", "questionnaire.rsvp_denied" => "Questionnaire Status: RSVP Denied", + "questionnaire.rsvp_reminder" => "Questionnaire: RSVP Reminder", "user.24hr_incomplete_application" => "User: Incomplete application (24 hours later)", "bus_list.new_captain_confirmation" => "Bus List: New captain confirmation", "bus_list.notes_update" => "Bus List: Updated notes (manually triggered)" diff --git a/app/models/questionnaire.rb b/app/models/questionnaire.rb index 0f692613a..1cb47671e 100644 --- a/app/models/questionnaire.rb +++ b/app/models/questionnaire.rb @@ -10,6 +10,7 @@ class Questionnaire < ApplicationRecord before_validation :clean_negative_dietary_restrictions after_create :queue_triggered_email_create after_update :queue_triggered_email_update + after_update :queue_triggered_email_rsvp_reminder after_save :update_school_questionnaire_count after_destroy :update_school_questionnaire_count @@ -19,7 +20,7 @@ class Questionnaire < ApplicationRecord validates_uniqueness_of :user_id - validates_presence_of :first_name, :last_name, :phone, :date_of_birth, :school_id, :experience, :shirt_size, :interest + validates_presence_of :phone, :date_of_birth, :school_id, :experience, :shirt_size, :interest validates_presence_of :gender, :major, :level_of_study, :graduation_year, :race_ethnicity validates_presence_of :agreement_accepted, message: "Please read & accept" validates_presence_of :code_of_conduct_accepted, message: "Please read & accept" @@ -137,6 +138,12 @@ def vcs_url=(value) super value end + def phone=(value) + # strips the string to just numbers for standardization + value = value.try(:tr, '^0-9', '') + super value + end + def school School.find(school_id) if school_id end @@ -145,10 +152,6 @@ def school_name school.name if school_id end - def full_name - "#{first_name} #{last_name}" - end - def full_location "#{school.city}, #{school.state}" end @@ -195,13 +198,6 @@ def did_rsvp? ['rsvp_confirmed', 'rsvp_denied'].include? acc_status end - def message_events - return [] unless ENV["SPARKPOST_API_KEY"].presence - - simple_spark = SimpleSpark::Client.new - simple_spark.message_events.search(recipients: email) - end - def verbal_status if acc_status == "rsvp_denied" "Not Attending" @@ -260,4 +256,18 @@ def queue_triggered_email_update def queue_triggered_email_create Message.queue_for_trigger("questionnaire.#{acc_status}", user_id) end + + def queue_triggered_email_rsvp_reminder + if saved_change_to_acc_status? && acc_status == "accepted" + days_remaining = Date.parse(HackathonConfig["event_start_date"]).in_time_zone.to_date - Time.now.in_time_zone.to_date + if days_remaining > 14 + deliver_date = 7.days.from_now + elsif days_remaining > 10 + deliver_date = 5.days.from_now + elsif days_remaining > 3 + deliver_date = 2.days.from_now + end + UserMailer.rsvp_reminder_email(user_id).deliver_later(wait_until: deliver_date) if deliver_date.present? + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index 378df208d..00f16f4d6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,5 +1,7 @@ class User < ApplicationRecord - audited only: [:email, :role, :is_active, :receive_weekly_report] + audited only: [:first_name, :last_name, :email, :role, :is_active, :receive_weekly_report] + + strip_attributes devise :database_authenticatable, :registerable, :timeoutable, :recoverable, :rememberable, :trackable, :validatable, @@ -13,13 +15,16 @@ class User < ApplicationRecord foreign_key: :resource_owner_id, dependent: :delete_all # or :destroy if you need callbacks + accepts_nested_attributes_for :questionnaire + validates_uniqueness_of :email + validates_presence_of :first_name, :last_name after_create :queue_reminder_email - - enum role: { user: 0, event_tracking: 1, admin_limited_access: 2, admin: 3 } after_initialize :set_default_role, if: :new_record? + enum role: { user: 0, volunteer: 1, organizer: 2, director: 3 } + def set_default_role self.role ||= :user end @@ -47,36 +52,42 @@ def safe_receive_weekly_report receive_weekly_report end - def first_name - return "" if questionnaire.blank? - questionnaire.first_name + def full_name + "#{first_name} #{last_name}" end - def last_name - return "" if questionnaire.blank? - questionnaire.last_name + def staff? + director? || organizer? || volunteer? end - def full_name - return email if questionnaire.blank? - questionnaire.full_name + def organizing_staff? + director? || organizer? end def self.from_omniauth(auth) matching_provider = where(provider: auth.provider, uid: auth.uid) matching_email = where(email: auth.info.email) - matching_provider.or(matching_email).first_or_create do |user| + current_user = matching_provider.or(matching_email).first_or_create do |user| user.uid = auth.uid + user.first_name = auth.info.first_name + user.last_name = auth.info.last_name user.email = auth.info.email + user.provider = auth.provider user.password = Devise.friendly_token[0, 20] end + # Autofill MyMLH provider if provider info is missing + # (as we are executing this from OAuth) + if current_user.provider.blank? + current_user.provider = auth.provider + end + current_user end - def self.non_admins - User.where.not(role: :admin).where.not(role: :admin_limited_access) + def self.non_organizer + User.where.not(role: :director).where.not(role: :organizer) end def self.without_questionnaire - non_admins.left_outer_joins(:questionnaire).where(questionnaires: { id: nil }) + non_organizer.left_outer_joins(:questionnaire).where(questionnaires: { id: nil }) end end diff --git a/app/views/application/_bus_list_info.html.haml b/app/views/application/_bus_list_info.html.haml index 930f35eb5..82d7ecbc0 100644 --- a/app/views/application/_bus_list_info.html.haml +++ b/app/views/application/_bus_list_info.html.haml @@ -5,7 +5,7 @@ %em TBD - bus_list.captains.each do |p| %p - %strong= p.full_name + %strong= p.user.full_name %br %em= p.school.name %br diff --git a/app/views/application/_questionnaire_summary.html.haml b/app/views/application/_questionnaire_summary.html.haml index d4a55a5c8..8a6f22959 100644 --- a/app/views/application/_questionnaire_summary.html.haml +++ b/app/views/application/_questionnaire_summary.html.haml @@ -17,16 +17,25 @@ %p %b Traveling from: = @questionnaire.travel_not_from_school ? "Somewhere else (#{@questionnaire.travel_location})" : "My school (#{@questionnaire.school.full_name})" +%p + %b Shirt size: + = @questionnaire.shirt_size +%p + %b Dietary restrictions + = @questionnaire.dietary_restrictions || "(none)".html_safe +%p + %b Special needs + = @questionnaire.special_needs || "(none)".html_safe %fieldset - if @questionnaire.user.provider == 'mlh' - %legend Provided by My MLH + %legend Provided by MyMLH %p %b First name: - = @questionnaire.first_name + = @questionnaire.user.first_name %p %b Last name: - = @questionnaire.last_name + = @questionnaire.user.last_name %p %b Email: = @questionnaire.email @@ -48,12 +57,3 @@ %p %b Level of study: = @questionnaire.level_of_study - %p - %b Shirt size: - = @questionnaire.shirt_size - %p - %b Dietary restrictions - = @questionnaire.dietary_restrictions || "(none)".html_safe - %p - %b Special needs - = @questionnaire.special_needs || "(none)".html_safe diff --git a/app/views/bus_lists/show.html.haml b/app/views/bus_lists/show.html.haml index 3b7b6785c..6f7a6ed59 100644 --- a/app/views/bus_lists/show.html.haml +++ b/app/views/bus_lists/show.html.haml @@ -43,8 +43,8 @@ %tr %td %input{type: 'checkbox', checked: p.boarded_bus?, data: { "boarded-bus": true, action: boarded_bus_bus_list_path, id: p.id } } - %td= p.first_name - %td= p.last_name + %td= p.user.first_name + %td= p.user.last_name %td= p.email %td= phone_link_to p.phone %td= p.school.name diff --git a/app/views/devise/passwords/_form.html.haml b/app/views/devise/passwords/_form.html.haml index 346f0177c..0e71d5a12 100644 --- a/app/views/devise/passwords/_form.html.haml +++ b/app/views/devise/passwords/_form.html.haml @@ -1,9 +1,12 @@ -.form-container - = simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| - = f.error_notification - .form-inputs - = f.input :email, required: true, autofocus: true - .center - .form-actions - = f.button :submit, "Send Reset Instructions" - = render "devise/shared/links" += simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| + = f.error_notification + .form-inputs + = f.input :email, required: true, autofocus: true + .form-actions.right + = f.button :submit, "Send Reset Instructions" + %p.session-link + Remembered it? + = link_to "Sign in!".html_safe, new_user_session_path + %p.session-link + No account? + = link_to "Register!".html_safe, new_user_registration_path diff --git a/app/views/devise/passwords/edit.html.haml b/app/views/devise/passwords/edit.html.haml index 0a06e95ae..4a866a98e 100644 --- a/app/views/devise/passwords/edit.html.haml +++ b/app/views/devise/passwords/edit.html.haml @@ -1,8 +1,8 @@ - title 'Change Password' -.form-container - .section-title +.form-container.password + .section-title.center Change Your - %span.emphasized Password + .emphasized Password = simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| = f.error_notification = f.input :reset_password_token, as: :hidden @@ -10,6 +10,8 @@ .form-inputs = f.input :password, label: "New Password", required: true, autofocus: true = f.input :password_confirmation, label: "Confirm", required: true - .form-actions + .form-actions.right = f.button :submit, "Change My Password" - = render "devise/shared/links" + %p.session-link + Remembered it? + = link_to "Sign in!".html_safe, new_user_session_path diff --git a/app/views/devise/passwords/new.html.haml b/app/views/devise/passwords/new.html.haml index 50f8d147b..b856f1727 100644 --- a/app/views/devise/passwords/new.html.haml +++ b/app/views/devise/passwords/new.html.haml @@ -1,7 +1,7 @@ - title 'Password Reset' -.form-container - %h1.section-title +.form-container.password + %h1.section-title.center Reset Your - %span.emphasized Password + .emphasized Password = render 'form' diff --git a/app/views/devise/registrations/_form.html.haml b/app/views/devise/registrations/_form.html.haml index 6ea83cf76..43e466fc7 100644 --- a/app/views/devise/registrations/_form.html.haml +++ b/app/views/devise/registrations/_form.html.haml @@ -6,7 +6,9 @@ %p %em or continue manually: .form-inputs - = f.input :email, required: true, autofocus: true + = f.input :first_name, required: true, autofocus: true + = f.input :last_name, required: true + = f.input :email, required: true = f.input :password, required: true = f.input :password_confirmation, required: true, label:"Confirm" .form-actions.right diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml index 3faa5fc93..50d55651b 100644 --- a/app/views/devise/registrations/new.html.haml +++ b/app/views/devise/registrations/new.html.haml @@ -2,13 +2,13 @@ .form-container.signup %h1.section-title.center Register for - %span.emphasized= HackathonConfig['name'] + .emphasized.text-overflow-center= HackathonConfig['name'] - - if !HackathonConfig['registration_is_open'] || HackathonConfig['disclaimer_message'].present? + - if !HackathonConfig['accepting_questionnaires'] || HackathonConfig['disclaimer_message'].present? #disclaimer - - if !HackathonConfig['registration_is_open'] + - if !HackathonConfig['accepting_questionnaires'] .center - %strong Registration is now closed. Thanks to everyone who applied! + %strong We are no longer accepting applications. Thanks to everyone who applied! %br - if HackathonConfig['disclaimer_message'].present? = markdown(HackathonConfig['disclaimer_message']) diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml index 15a762ec3..b9bb3896c 100644 --- a/app/views/devise/sessions/new.html.haml +++ b/app/views/devise/sessions/new.html.haml @@ -2,9 +2,5 @@ .form-container.login %h1.section-title.center Sign in to - %span.emphasized= HackathonConfig['name'] - - if notice - .form-success - .success_message - %p#notice= notice + .emphasized.text-overflow-center= HackathonConfig['name'] = render 'form' diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml index 70e752570..91427e44d 100644 --- a/app/views/layouts/_header.html.haml +++ b/app/views/layouts/_header.html.haml @@ -10,6 +10,8 @@ = btn_link_to "Home", homepage_url .header-nav - if user_signed_in? - - if current_user.admin? + - if current_user.organizing_staff? = btn_link_to "Manage", manage_root_path + - elsif current_user.volunteer? + = btn_link_to "Manage", manage_checkins_path = btn_link_to "Sign Out", destroy_user_session_path, method: :delete diff --git a/app/views/layouts/manage/_page_title.html.haml b/app/views/layouts/manage/_page_title.html.haml index 4affee59c..d4b2a0e3c 100644 --- a/app/views/layouts/manage/_page_title.html.haml +++ b/app/views/layouts/manage/_page_title.html.haml @@ -4,5 +4,5 @@ - if defined?(subtitle) && subtitle.present? %small.text-muted= subtitle - - if current_user.try(:admin?) + - if current_user.try(:director?) = yield diff --git a/app/views/layouts/manage/application.html.haml b/app/views/layouts/manage/application.html.haml index 7339462f9..c529658dd 100644 --- a/app/views/layouts/manage/application.html.haml +++ b/app/views/layouts/manage/application.html.haml @@ -25,75 +25,110 @@ .row %nav.col-md-2.d-none.d-md-block.bg-light.sidebar .sidebar-sticky - %ul.nav.flex-column - %li.nav-item - = active_link_to manage_root_path, class: "nav-link", active_children: false do - .fa.fa-area-chart.fa-fw.icon-space-r-half - Dashboard - %li.nav-item - = active_link_to manage_questionnaires_path, class: "nav-link" do - .fa.fa-inbox.fa-fw.icon-space-r-half - Questionnaires - %li.nav-item - = active_link_to manage_checkins_path, class: "nav-link" do - .fa.fa-drivers-license-o.fa-fw.icon-space-r-half - Check-in - %li.nav-item - = active_link_to manage_admins_path, class: "nav-link" do - .fa.fa-users.fa-fw.icon-space-r-half - Admins - %li.nav-item - = active_link_to manage_messages_path, class: "nav-link" do - .fa.fa-bullhorn.fa-fw.icon-space-r-half - Messages + %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted + %span + = t(:overview, scope: 'layouts.manage.navigation') + - if current_user.organizing_staff? + %ul.nav.flex-column.mb-2 + %li.nav-item + = active_link_to manage_root_path, class: "nav-link", active_children: false do + .fa.fa-area-chart.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.dashboard') + %li.nav-item + = active_link_to manage_questionnaires_path, class: "nav-link" do + .fa.fa-inbox.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.questionnaires') + %li.nav-item + = active_link_to manage_messages_path, class: "nav-link" do + .fa.fa-bullhorn.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.messages') + - elsif current_user.volunteer? + %ul.nav.flex-column.mb-2 + %li.nav-item + = active_link_to manage_checkins_path, class: "nav-link" do + .fa.fa-drivers-license-o.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.check-in') + %li.nav-item + = active_link_to manage_questionnaires_path, class: "nav-link" do + .fa.fa-inbox.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.questionnaires') + + - if current_user.organizing_staff? + %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted + %span + = t(:logistics, scope: 'layouts.manage.navigation') + %ul.nav.flex-column.mb-2 + %li.nav-item + = active_link_to manage_checkins_path, class: "nav-link" do + .fa.fa-drivers-license-o.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.check-in') + %li.nav-item + = active_link_to manage_stats_path, class: "nav-link" do + .fa.fa-table.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.stats') + %li.nav-item + = active_link_to manage_trackable_tags_path, class: "nav-link" do + .fa.fa-tag.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.trackable-tags') + + %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted + %span + = t(:travel, scope: 'layouts.manage.navigation') + %ul.nav.flex-column.mb-2 %li.nav-item = active_link_to manage_bus_lists_path, class: "nav-link" do .fa.fa-bus.fa-fw.icon-space-r-half - Bus Lists + = t(:title, scope: 'pages.manage.bus-lists') %li.nav-item = active_link_to manage_schools_path, class: "nav-link" do .fa.fa-home.fa-fw.icon-space-r-half - Schools - %li.nav-item - = active_link_to manage_stats_path, class: "nav-link" do - .fa.fa-table.fa-fw.icon-space-r-half - Stats - %li.nav-item - = active_link_to manage_trackable_tags_path, class: "nav-link" do - .fa.fa-tag.fa-fw.icon-space-r-half - Trackable Tags - - if current_user.admin? + = t(:title, scope: 'pages.manage.schools') + + - if current_user.director? %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted - %span Advanced + %span + = t(:administration, scope: 'layouts.manage.navigation') %ul.nav.flex-column.mb-2 + %li.nav-item + = active_link_to manage_users_path, class: "nav-link" do + .fa.fa-users.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.users') %li.nav-item = active_link_to manage_configs_path, class: "nav-link" do .fa.fa-wrench.fa-fw.icon-space-r-half - Config - .nav-item-description Manage configuration + = t(:title, scope: 'pages.manage.settings') + + %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted + %span + = t(:advanced, scope: 'layouts.manage.navigation') + %ul.nav.flex-column.mb-2 %li.nav-item = active_link_to sidekiq_web_path, target: '_blank', class: "nav-link" do .fa.fa-tasks.fa-fw.icon-space-r-half - Sidekiq + = t(:title, scope: 'pages.manage.sidekiq') %span.fa.fa-external-link.icon-space-l-half - .nav-item-description Monitor background jobs + .nav-item-description + = t(:sidekiq, scope: 'layouts.manage.navigation.descriptors') %li.nav-item = active_link_to blazer_path, target: '_blank', class: "nav-link" do .fa.fa-terminal.fa-fw.icon-space-r-half - Blazer + = t(:title, scope: 'pages.manage.blazer') %span.fa.fa-external-link.icon-space-l-half - .nav-item-description Run custom SQL queries + .nav-item-description + = t(:blazer, scope: 'layouts.manage.navigation.descriptors') %li.nav-item = active_link_to oauth_applications_path, target: '_blank', class: "nav-link" do .fa.fa-unlock.fa-fw.icon-space-r-half - Doorkeeper + = t(:title, scope: 'pages.manage.doorkeeper') %span.fa.fa-external-link.icon-space-l-half - .nav-item-description OAuth2 provider management + .nav-item-description + = t(:doorkeeper, scope: 'layouts.manage.navigation.descriptors') %li.nav-item = active_link_to manage_data_exports_path, class: "nav-link" do .fa.fa-download.fa-fw.icon-space-r-half - Data Exports - .nav-item-description Generate & export data + = t(:title, scope: 'pages.manage.data-exports') + .nav-item-description + = t(:dataexports, scope: 'layouts.manage.navigation.descriptors') %main.col-md-10.ml-sm-auto.px-4{role: "main"} = render "layouts/manage/flashes" = yield diff --git a/app/views/layouts/admin_mailer.html.erb b/app/views/layouts/staff_mailer.html.erb similarity index 100% rename from app/views/layouts/admin_mailer.html.erb rename to app/views/layouts/staff_mailer.html.erb diff --git a/app/views/manage/admins/_form.html.haml b/app/views/manage/admins/_form.html.haml index 6baa82497..e69de29bb 100644 --- a/app/views/manage/admins/_form.html.haml +++ b/app/views/manage/admins/_form.html.haml @@ -1,19 +0,0 @@ -.form-container - = bs_horizontal_simple_form_for @user, url: url_for(action: @user.new_record? ? "create" : "update", controller: "admins"), html: { "data-validate" => "form" } do |f| - - - if @user.new_record? - %p - If a user already exists, first delete the questionnaire in the - = link_to "questionnaires manager.", manage_questionnaires_path - - if f.error_notification.present? - #disclaimer - = f.error_notification - - .form-inputs - = f.input :email, input_html: { "data-validate" => "presence" }, required: true - = f.input :role, collection: User.roles.to_a.collect{|c| [c[0].titleize, c[0]]}, include_blank: false - = f.input :is_active, collection: [['Active', true], ['Inactive', false]], as: :radio_buttons - = f.input :receive_weekly_report, collection: [['Yes', true], ['No', false]], as: :radio_buttons - - .center - = f.button :submit, value: ( @user.new_record? ? 'Create' : 'Save' ), class: 'btn-primary' diff --git a/app/views/manage/admins/edit.html.haml b/app/views/manage/admins/edit.html.haml deleted file mode 100644 index fd0b9af57..000000000 --- a/app/views/manage/admins/edit.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -= render "layouts/manage/page_title", title: "Edit Admin", subtitle: @user.email do - .btn-group - = link_to 'Cancel', manage_admin_path(@user), class: 'btn btn-sm btn-outline-secondary' - = link_to 'Delete', manage_admin_path(@user), method: :delete, data: { confirm: "Are you sure? #{@user.email} will be permanently deleted. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary' - - -= render 'form' diff --git a/app/views/manage/admins/index.html.haml b/app/views/manage/admins/index.html.haml index ed72eef9e..e69de29bb 100644 --- a/app/views/manage/admins/index.html.haml +++ b/app/views/manage/admins/index.html.haml @@ -1,19 +0,0 @@ -= render "layouts/manage/page_title", title: "Admins" do - = link_to "New Admin", new_manage_admin_path, class: "btn btn-sm btn-outline-secondary" - -%div - %table.users.datatable.table.table-striped.table-hover{ "data-source" => datatable_manage_admins_path(format: :json) } - %thead - %tr - %th ID - %th Email - %th Role - %th Login access - %th Weekly report - %th Registered on - %th Signed-in on - %th Previous signed-in on - %th Signed-in IP - %th Previous signed-in IP - %th Sign-in count - %tbody diff --git a/app/views/manage/admins/new.html.haml b/app/views/manage/admins/new.html.haml deleted file mode 100644 index 1a6257ff4..000000000 --- a/app/views/manage/admins/new.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -= render "layouts/manage/page_title", title: "New Admin" - -= render 'form' - -.form-container - .center - = link_to 'Back', manage_admins_path diff --git a/app/views/manage/admins/show.html.haml b/app/views/manage/admins/show.html.haml deleted file mode 100644 index 73f498e0f..000000000 --- a/app/views/manage/admins/show.html.haml +++ /dev/null @@ -1,61 +0,0 @@ -= render "layouts/manage/page_title", title: @user.email do - .btn-group - = link_to 'Edit', edit_manage_admin_path(@user), class: 'btn btn-sm btn-outline-secondary' - = link_to 'Delete', manage_admin_path(@user), method: :delete, data: { confirm: "Are you sure? #{@user.email} will be permanently deleted. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary' - -.row.mt-2.mb-4 - .col-lg-6 - %p - %b Email address: - = @user.email - - %p - %b Role: - = @user.role.titleize - - %p - %b Login access: - - if @user.is_active - %span.badge.badge-success Active - - else - %span.badge.badge-danger Inactive - - %p - %b Receive weekly report: - - if @user.receive_weekly_report - %span.badge.badge-success Yes - - if !@user.is_active - %br - %small - %span.fa.fa-info-circle.icon-space-r-half - Will not receive while user is inactive - - else - %span.badge.badge-secondary No - - %p - %b Registered: - = display_datetime(@user.created_at) - - %p - %b Signed-in on: - = display_datetime(@user.current_sign_in_at) - - %p - %b Previous signed-in on: - = display_datetime(@user.last_sign_in_at) - - %p - %b Signed-in IP: - = @user.current_sign_in_ip == "::1" ? "127.0.0.1" : @user.current_sign_in_ip - - %p - %b Previous signed-in IP: - = @user.last_sign_in_ip == "::1" ? "127.0.0.1" : @user.last_sign_in_ip - - %p - %b Sign-in count: - = @user.sign_in_count - - .col-lg-6 - %h4.border-bottom.pb-2.mb-3 Change History - = render "model_history", model: @user diff --git a/app/views/manage/application/_model_history.html.haml b/app/views/manage/application/_model_history.html.haml index 2377bc78b..405d1e1ef 100644 --- a/app/views/manage/application/_model_history.html.haml +++ b/app/views/manage/application/_model_history.html.haml @@ -15,7 +15,7 @@ - next if ignore_fields.include? field %p.mb-1 = t("simple_form.labels.#{audit.auditable.class.name.downcase}.#{field}") - - if audit.auditable.class.columns_hash[field].type == :text + - if audit.auditable.class.columns_hash[field].nil? || audit.auditable.class.columns_hash[field].type == :text changed - else changed to diff --git a/app/views/manage/application/_questionnaire_datatable.html.haml b/app/views/manage/application/_questionnaire_datatable.html.haml index 61f33683c..a985b3d44 100644 --- a/app/views/manage/application/_questionnaire_datatable.html.haml +++ b/app/views/manage/application/_questionnaire_datatable.html.haml @@ -19,7 +19,7 @@ %thead %tr %th{'data-table': { orderable: 'false', data: 'bulk', visible: bulk_actions ? 'true' : 'false' }} - - if current_user.admin? + - if current_user.director? %input{ type: "checkbox", name: "select_allc", value: "1", data: { bulk_row_select: "" } } %th{'data-table': { orderable: 'false', data: 'link', visible: visible.call('link', columns) }} %th{'data-table': { orderable: 'false', data: 'note', visible: visible.call('note', columns) }} diff --git a/app/views/manage/bus_lists/index.html.haml b/app/views/manage/bus_lists/index.html.haml index 33db1cda8..e20889cb9 100644 --- a/app/views/manage/bus_lists/index.html.haml +++ b/app/views/manage/bus_lists/index.html.haml @@ -1,4 +1,4 @@ -= render "layouts/manage/page_title", title: "Bus Lists", docs: 'https://coderit.org/hackathon-manager/docs/busses' do += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.bus-lists'), docs: 'https://coderit.org/hackathon-manager/docs/busses' do = link_to "New Bus List", new_manage_bus_list_path, class: "btn btn-sm btn-outline-secondary" .mb-4 diff --git a/app/views/manage/bus_lists/show.html.haml b/app/views/manage/bus_lists/show.html.haml index 7534a3ad1..1bc51c05b 100644 --- a/app/views/manage/bus_lists/show.html.haml +++ b/app/views/manage/bus_lists/show.html.haml @@ -59,18 +59,18 @@ %th Email %th Phone Number %th School - - if current_user.admin? + - if current_user.director? %th Actions %tbody - @bus_list.passengers.select { |q| q.bus_captain_interest }.each do |p| %tr %td= link_to ''.html_safe, manage_questionnaire_path(p) - %td= p.first_name - %td= p.last_name + %td= p.user.first_name + %td= p.user.last_name %td= p.email %td= phone_link_to p.phone %td= link_to p.school.name, manage_school_path(p.school) - - if current_user.admin? + - if current_user.director? %td - if p.is_bus_captain? = link_to "Remove Bus Captain", toggle_bus_captain_manage_bus_list_path(@bus_list, questionnaire_id: p.id, bus_captain: '0'), method: 'post', class: 'text-danger' diff --git a/app/views/manage/checkins/index.html.haml b/app/views/manage/checkins/index.html.haml index 21386b20d..772f15e15 100644 --- a/app/views/manage/checkins/index.html.haml +++ b/app/views/manage/checkins/index.html.haml @@ -1,4 +1,4 @@ -= render "layouts/manage/page_title", title: "Check-in" += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.check-in') .mb-4 %table.checkins.datatable.table.table-striped.table-hover{ "data-source" => datatable_manage_checkins_path(format: :json) } diff --git a/app/views/manage/checkins/show.html.haml b/app/views/manage/checkins/show.html.haml index c7e1b0484..a0ea0182e 100644 --- a/app/views/manage/checkins/show.html.haml +++ b/app/views/manage/checkins/show.html.haml @@ -1,7 +1,7 @@ .d-flex.justify-content-between.flex-wrap.flex-md-nowrap.align-items-center.pt-3.pb-2.mb-3.border-bottom .d-flex.align-items-center.flex-wrap %h1.h2.mr-3 - = title @questionnaire.full_name + = title @questionnaire.user.full_name %div %span.mr-1 = render 'manage/questionnaires/acc_status_badge' @@ -19,7 +19,7 @@ .card-body .row %dt.col-md-4 Name - %dd.col-md-8= @questionnaire.full_name + %dd.col-md-8= @questionnaire.user.full_name %dt.col-md-4 School %dd.col-md-8 - school = @questionnaire.school diff --git a/app/views/manage/configs/edit.html.haml b/app/views/manage/configs/edit.html.haml index 45919bdcf..3a2dda9e7 100644 --- a/app/views/manage/configs/edit.html.haml +++ b/app/views/manage/configs/edit.html.haml @@ -1,6 +1,6 @@ :ruby text_field_vars = %w() - markdown_field_vars = %w(bus_captain_notes thanks_for_rsvp_message thanks_for_applying_message disclaimer_message) + markdown_field_vars = %w(bus_captain_notes thanks_for_rsvp_message thanks_for_applying_message questionnaires_closed_message disclaimer_message) css_field_vars = %w(custom_css) form_field_vars = %w(disabled_fields) diff --git a/app/views/manage/configs/index.html.haml b/app/views/manage/configs/index.html.haml index 7b0438c46..8d71d17c2 100644 --- a/app/views/manage/configs/index.html.haml +++ b/app/views/manage/configs/index.html.haml @@ -1,4 +1,4 @@ -= render "layouts/manage/page_title", title: "Hackathon Configuration" += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.settings') .row .col-lg-6.mb-3 @@ -74,21 +74,20 @@ %b Email Provider - if Rails.application.config.action_mailer.delivery_method == :smtp %p - %span.badge.badge-secondary SparkPost + %span.badge.badge-secondary SendGrid %span.badge.badge-success SMTP %br %small - %i To switch to SparkPost, unset the SMTP_ADDRESS environment variable + %i To switch to SendGrid, unset the SMTP_ADDRESS environment variable = render 'config_row', name: 'SMTP Address', key: 'SMTP_ADDRESS' = render 'config_row', name: 'SMTP Port', key: 'SMTP_PORT', default: 587 = render 'config_row', name: 'SMTP Username', key: 'SMTP_USER_NAME', secret: true = render 'config_row', name: 'SMTP Password', key: 'SMTP_PASSWORD', secret: true - else %p - %span.badge.badge-success SparkPost + %span.badge.badge-success SendGrid %span.badge.badge-secondary SMTP %br %small %i To switch to SMTP, set the SMTP_ADDRESS environment variable - = render 'config_row', name: 'SparkPost Campaign ID', key: 'SPARKPOST_CAMPAIGN_ID' - = render 'config_row', name: 'SparkPost API Key', key: 'SPARKPOST_API_KEY', secret: true + = render 'config_row', name: 'SendGrid API Key', key: 'SENDGRID_API_KEY', secret: true diff --git a/app/views/manage/dashboard/index.html.haml b/app/views/manage/dashboard/index.html.haml index c0a070828..574d2b775 100644 --- a/app/views/manage/dashboard/index.html.haml +++ b/app/views/manage/dashboard/index.html.haml @@ -9,14 +9,13 @@ = javascript_include_tag "vendor/queue.v1.min.js" = javascript_include_tag "vendor/topojson.v1.min.js" -= render "layouts/manage/page_title", title: "Dashboard" += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.dashboard') --# - .row - .col - #map - :javascript - $('#map').initMap(); +.row + .col + #map + :javascript + $('#map').initMap(); .row .col-7 diff --git a/app/views/manage/dashboard/map_data.tsv.erb b/app/views/manage/dashboard/map_data.tsv.erb index 8723d5df5..9b8d9c302 100644 --- a/app/views/manage/dashboard/map_data.tsv.erb +++ b/app/views/manage/dashboard/map_data.tsv.erb @@ -9,19 +9,22 @@ redo_limit = 10 if school.fips_code.blank? next if school.city.blank? || school.state.blank? - resp = HTTParty.get("https://maps.googleapis.com/maps/api/geocode/json?address=#{CGI.escape(school.city)}+#{CGI.escape(school.state)}&sensor=true") - results = resp.parsed_response["results"][0] - if results.blank? + resp = HTTParty.get("https://geocoding.geo.census.gov/geocoder/locations/address?street=#{CGI.escape(school.address)}&city=#{CGI.escape(school.city)}&state=#{CGI.escape(school.state)}&benchmark=Public_AR_Current&format=json") + result = resp.parsed_response["result"] + if result.blank? if redo_count >= redo_limit - raise 'Exceeded maximum number of retries: No results from Google Maps API.' + raise 'Exceeded maximum number of retries: No results from Census.gov.' end redo_count += 1 redo end redo_count = 0 - lat = results["geometry"]["location"]["lat"] - lng = results["geometry"]["location"]["lng"] + addressMatches = result["addressMatches"] + next if addressMatches.blank? + + lng = result["addressMatches"][0]["coordinates"]["x"] + lat = result["addressMatches"][0]["coordinates"]["y"] next if lat.blank? || lng.blank? resp = HTTParty.get("https://geo.fcc.gov/api/census/area?lat=#{lat}&lon=#{lng}&format=json") diff --git a/app/views/manage/data_exports/index.html.haml b/app/views/manage/data_exports/index.html.haml index 7597773ea..1f47f9ab7 100644 --- a/app/views/manage/data_exports/index.html.haml +++ b/app/views/manage/data_exports/index.html.haml @@ -1,4 +1,4 @@ -= render "layouts/manage/page_title", title: "Data Exports" do += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.data-exports') do = link_to "New Data Export", new_manage_data_export_path, class: "btn btn-sm btn-outline-secondary" %table.table.table-striped diff --git a/app/views/manage/messages/_message_template_status.haml b/app/views/manage/messages/_message_template_status.haml index 6677e267f..971ee2c82 100644 --- a/app/views/manage/messages/_message_template_status.haml +++ b/app/views/manage/messages/_message_template_status.haml @@ -5,7 +5,7 @@ %span.badge.badge-danger.mb-1 Using customized template %br Not in sync with HackathonManager - - if current_user.try(:admin?) + - if current_user.try(:director?) %br %small = link_to template_replace_with_default_manage_messages_path, method: :post, data: { confirm: 'Are you sure? This will permanently erase the existing template and replace it with the HackathonManager default. This action is irreversible.'} do diff --git a/app/views/manage/messages/index.html.haml b/app/views/manage/messages/index.html.haml index 99d733353..8fd7b7a12 100644 --- a/app/views/manage/messages/index.html.haml +++ b/app/views/manage/messages/index.html.haml @@ -1,4 +1,4 @@ -= render "layouts/manage/page_title", title: "Messages" do += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.messages') do = link_to "New Message", new_manage_message_path, class: "btn btn-sm btn-outline-secondary" .mb-4 @@ -19,7 +19,7 @@ = render 'triggered_email_summary' -- if current_user.try(:admin?) +- if current_user.try(:director?) .mb-4 %h3.pb-2.mb-3.border-bottom#triggered-email-overview Message Template %p The message template is used for all outgoing emails. If desired, it may be customized to your needs. diff --git a/app/views/manage/messages/show.html.haml b/app/views/manage/messages/show.html.haml index bad3228ad..b205d9014 100644 --- a/app/views/manage/messages/show.html.haml +++ b/app/views/manage/messages/show.html.haml @@ -1,6 +1,12 @@ :ruby begin - recipient_count = pluralize(BulkMessageJob.build_recipients(@message.recipients).count, "recipient") + recipient_count = pluralize(BulkMessageJob.build_recipients(@message.recipients).count, "Recipient") + number_of_recipients = BulkMessageJob.build_recipients(@message.recipients).count + recipient_plural = "Recipient" + if number_of_recipients > 1 + recipient_plural = "Recipients" + end + rescue => recipient_error end @@ -10,9 +16,25 @@ - if recipient_error.present? %button.btn.btn-sm.btn-outline-secondary{disabled: 'disabled', title: 'Cannot deliver when there is a recipient error; see error above.'} Deliver - else - = link_to deliver_manage_message_path(@message), method: :patch, data: { confirm: "Are you sure? The message \"#{@message.name}\" will be sent to #{recipient_count}." }, class: 'btn btn-sm btn-primary' do + %button.btn.btn-sm.btn-primary{"data-toggle"=>"modal", "data-target"=>"#confirm-messages"} %span.fa.fa-send.icon-space-r-half - Send + %span Send + .modal{:id => "confirm-messages"} + .modal-dialog{:role => "document"} + .modal-content + .modal-header + %h5{:class => "modal-title"} Confirm + .modal-body + %p Are you sure? The message "#{@message.name}" will be sent to: + %h3.center + %span.font-weight-bold + = number_with_delimiter(number_of_recipients) + %span + = recipient_plural + .modal-footer + %button.btn.btn-outline-secondary{'data-dismiss'=>"modal"} Close + = link_to deliver_manage_message_path(@message), method: :patch, class: 'btn btn-danger' do + %span Send Message - if @message.can_edit? = link_to 'Edit', edit_manage_message_path(@message), class: 'btn btn-sm btn-outline-secondary' = link_to 'Delete', manage_message_path(@message), method: :delete, data: { confirm: "Are you sure? The message \"#{@message.name}\" will be permanently erased. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary' diff --git a/app/views/manage/questionnaires/_form.html.haml b/app/views/manage/questionnaires/_form.html.haml index 91fff3521..b52c22783 100644 --- a/app/views/manage/questionnaires/_form.html.haml +++ b/app/views/manage/questionnaires/_form.html.haml @@ -11,22 +11,25 @@ .card-body - if @questionnaire&.user&.provider == 'mlh' %h6.card-subtitle.mb-2 - %span.badge.badge-info Provided by My MLH - = f.input :first_name, input_html: { "data-validate" => "presence" }, label: "First Name", autofocus: true - = f.input :last_name, input_html: { "data-validate" => "presence" }, label: "Last Name" + %span.badge.badge-info Provided by MyMLH + = f.simple_fields_for :user, @questionnaire.user do |u| + = u.input :first_name, input_html: { "data-validate" => "presence" }, label: "First Name", autofocus: true + = u.input :last_name, input_html: { "data-validate" => "presence" }, label: "Last Name" = f.input :email, input_html: { "data-validate" => "presence email", value: @questionnaire.user.try(:email) }, required: true, hint: 'Can be an existing user (without a questionnaire) or a new user. If this is a new user, they will receive a randomly-generated password that they must request a password reset for.' = f.input :phone, input_html: { "data-validate" => "presence" } = f.input :date_of_birth, start_year: Date.today.year - 18, end_year: Date.today.year - 90, order: [:month, :day, :year], input_html: { "data-validate" => "presence" } - = f.input :school_id, as: :school_selection, input_html: { "data-validate" => "presence" } = f.input :level_of_study, input_html: { "data-validate" => "presence" } = f.input :major, input_html: { "data-validate" => "presence" } - = f.input :shirt_size, as: :select, collection: Questionnaire::POSSIBLE_SHIRT_SIZES, include_blank: "(select one...)", input_html: { "data-validate" => "presence" } = f.input :gender, input_html: { "data-validate" => "presence" } - = f.input :dietary_restrictions, label: "Dietary restrictions" - = f.input :special_needs, label: "Special needs" .col-xl-6 + .card.mb-4 + .card-header Special notices + .card-body + = f.input :shirt_size, as: :select, collection: Questionnaire::POSSIBLE_SHIRT_SIZES, include_blank: "(select one...)", input_html: { "data-validate" => "presence" } + = f.input :dietary_restrictions, label: "Dietary restrictions" + = f.input :special_needs, label: "Special needs" .card.mb-4 .card-header Resume .card-body diff --git a/app/views/manage/questionnaires/_history.html.haml b/app/views/manage/questionnaires/_history.html.haml index c8093a583..e8f32fe11 100644 --- a/app/views/manage/questionnaires/_history.html.haml +++ b/app/views/manage/questionnaires/_history.html.haml @@ -1,18 +1,6 @@ .row - .col-lg-6 + .col-lg .card.mb-3 .card-header Recent Changes .card-body.pb-2 = render "model_history", model: @questionnaire, audits: @questionnaire.audits + @questionnaire.user.audits - - .col-lg-6 - .card.mb-3 - .card-header Recent Email Events - .card-body - - email_provider = Rails.application.config.action_mailer.delivery_method - - if email_provider == :sparkpost - .email-events{ data: { url: message_events_manage_questionnaire_path(@questionnaire) } } - %em Email events not available at this time. - - else - %p.alert.alert-info - Not supported with current email provider (#{email_provider}) diff --git a/app/views/manage/questionnaires/_overview.html.haml b/app/views/manage/questionnaires/_overview.html.haml index 09642fcd1..5e410bbf4 100644 --- a/app/views/manage/questionnaires/_overview.html.haml +++ b/app/views/manage/questionnaires/_overview.html.haml @@ -9,9 +9,9 @@ .card-body .row %dt.col-md-4 First name - %dd.col-md-8= @questionnaire.first_name + %dd.col-md-8= @questionnaire.user.first_name %dt.col-md-4 Last name - %dd.col-md-8= @questionnaire.last_name + %dd.col-md-8= @questionnaire.user.last_name %dt.col-md-4 Email %dd.col-md-8= @questionnaire.email %dt.col-md-4 Phone @@ -23,8 +23,6 @@ = @questionnaire.age_at_time_of_event / 1.year %dt.col-md-4 Gender %dd.col-md-8= @questionnaire.gender - %dt.col-md-4 Shirt size - %dd.col-md-8= @questionnaire.shirt_size = render 'checkin_compliance_card' @@ -33,6 +31,8 @@ .card-header Special notices .card-body .row + %dt.col-md-4 Shirt size + %dd.col-md-8= @questionnaire.shirt_size %dt.col-md-4 Dietary restrictions %dd.col-md-8 - if @questionnaire.dietary_restrictions.present? diff --git a/app/views/manage/questionnaires/edit.html.haml b/app/views/manage/questionnaires/edit.html.haml index 49851931b..9b2faa621 100644 --- a/app/views/manage/questionnaires/edit.html.haml +++ b/app/views/manage/questionnaires/edit.html.haml @@ -1,6 +1,6 @@ -= render "layouts/manage/page_title", title: "Edit Questionnaire", subtitle: @questionnaire.full_name do += render "layouts/manage/page_title", title: "Edit Questionnaire", subtitle: @questionnaire.user.full_name do .btn-group = link_to 'Cancel', manage_questionnaire_path(@questionnaire), class: 'btn btn-sm btn-outline-secondary' - = link_to 'Delete', manage_questionnaire_path(@questionnaire), method: :delete, data: { confirm: "Are you sure? The questionnaire and account for \"#{@questionnaire.full_name}\" will be permanently erased. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary' + = link_to 'Delete', manage_questionnaire_path(@questionnaire), method: :delete, data: { confirm: "Are you sure? The questionnaire will be permanently deleted. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary' = render 'form' diff --git a/app/views/manage/questionnaires/index.html.haml b/app/views/manage/questionnaires/index.html.haml index 2948f03d6..4ba428587 100644 --- a/app/views/manage/questionnaires/index.html.haml +++ b/app/views/manage/questionnaires/index.html.haml @@ -1,4 +1,4 @@ -= render "layouts/manage/page_title", title: "Questionnaires" do += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.questionnaires') do = link_to "New Questionnaire", new_manage_questionnaire_path, class: "btn btn-sm btn-outline-secondary" = render "questionnaire_datatable" diff --git a/app/views/manage/questionnaires/show.html.haml b/app/views/manage/questionnaires/show.html.haml index 429872c48..eceae3356 100644 --- a/app/views/manage/questionnaires/show.html.haml +++ b/app/views/manage/questionnaires/show.html.haml @@ -1,7 +1,7 @@ .d-flex.justify-content-between.flex-wrap.flex-md-nowrap.align-items-center.pt-3.pb-2.mb-3.border-bottom .d-flex.align-items-center.flex-wrap %h1.h2.mr-3 - = title @questionnaire.full_name + = title @questionnaire.user.full_name %div %span.mr-1 = render 'acc_status_badge' @@ -9,14 +9,8 @@ = render 'check_in_badge' .btn-group{role: "group"} - - if current_user.admin? + - if current_user.director? = link_to 'Edit', edit_manage_questionnaire_path(@questionnaire), class: 'btn btn-sm btn-outline-secondary' - - if current_user.admin? - .btn-group{role: "group"} - %button.btn.btn-sm.btn-outline-secondary.dropdown-toggle#title-actions{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button"} - .fa.fa-cog - .dropdown-menu.dropdown-menu-right{"aria-labelledby" => "title-actions"} - = link_to 'Convert to Admin', convert_to_admin_manage_questionnaire_path(@questionnaire), method: :patch, data: { confirm: "Are you sure? The questionnaire for \"#{@questionnaire.full_name}\" will be permanently erased, and \"#{@questionnaire.email}\" will become an admin. This action is irreversible." }, class: 'dropdown-item' = render 'overview' @@ -40,7 +34,7 @@ - else = "(no author)" = @questionnaire.acc_status_date ? display_datetime(@questionnaire.acc_status_date, in_sentence: true) : "(no date)" - - if current_user.admin? + - if current_user.director? = bs_vertical_simple_form @questionnaire, url: url_for(action: "update_acc_status", controller: "questionnaires") do |f| = f.input :acc_status, as: :select, collection: Questionnaire::POSSIBLE_ACC_STATUS.invert, include_blank: false, label: "Acceptance Status:", hint: "Updating this status may trigger an automatic email to the applicant - see #{link_to('messages', manage_messages_path(anchor: 'triggered-email-overview'))} for details.".html_safe = f.button :submit, value: "Update Status", class: 'btn-primary' diff --git a/app/views/manage/schools/index.html.haml b/app/views/manage/schools/index.html.haml index 8f7e9a1b0..10d963f00 100644 --- a/app/views/manage/schools/index.html.haml +++ b/app/views/manage/schools/index.html.haml @@ -1,4 +1,4 @@ -= render "layouts/manage/page_title", title: "Schools" do += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.schools') do = link_to "New School", new_manage_school_path, class: "btn btn-sm btn-outline-secondary" .mb-4 diff --git a/app/views/manage/stats/index.html.haml b/app/views/manage/stats/index.html.haml index 9e5f22cd2..310caa9de 100644 --- a/app/views/manage/stats/index.html.haml +++ b/app/views/manage/stats/index.html.haml @@ -1,15 +1,17 @@ -= render "layouts/manage/page_title", title: "Statistics & Info" += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.stats') .row .col - %h5.dashboard-container-title Dietary Restrictions & Special Needs - %table.stats.datatable.table.table-striped.table-hover{ "data-source" => dietary_special_needs_manage_stats_path(format: :json) } + %h5.dashboard-container-title Dietary Restrictions or Special Needs + %table.datatable.stats-dietary.table.table-striped.table-hover{ "data-source" => dietary_restrictions_special_needs_datatable_manage_stats_path(format: :json) } %thead %tr - %th First name - %th Last name + %th ID + %th First Name + %th Last Name %th Email %th Phone + %th Questionnaire %th Checked In %th Dietary Restrictions %th Special Needs @@ -18,53 +20,59 @@ .row .col %h5.dashboard-container-title Attendees Not Traveling From Their School - %table.stats.datatable.table.table-striped.table-hover{ "data-source" => alt_travel_manage_stats_path(format: :json) } + %table.datatable.stats-notschooltravel.table.table-striped.table-hover{ "data-source" => alt_travel_datatable_manage_stats_path(format: :json) } %thead %tr - %th Link - %th First name - %th Last name + %th ID + %th First Name + %th Last Name %th Email + %th Phone + %th Questionnaire %th Traveling From - %th Acc Status + %th Questionnaire Status %tbody .row .col %h5.dashboard-container-title Attendee Info for Sponsors - %table.stats.datatable.table.table-striped.table-hover{ "data-source" => sponsor_info_manage_stats_path(format: :json) } + %table.datatable.stats-attendeeinfo.table.table-striped.table-hover{ "data-source" => attendee_sponsor_info_datatable_manage_stats_path(format: :json) } %thead %tr + %th ID %th First name %th Last name %th Email %th School %th Open Source Link %th Portfolio Link - %th Resume Link %tbody .row .col %h5.dashboard-container-title MLH Info (applied) - %table.stats.datatable.table.table-striped.table-hover{ "data-source" => mlh_info_applied_manage_stats_path(format: :json) } + %table.datatable.stats-mlhinfo-applied.table.table-striped.table-hover{ "data-source" => mlh_applied_datatable_manage_stats_path(format: :json) } %thead %tr + %th ID %th First name %th Last name %th Email + %th Phone %th School Name %tbody .row .col %h5.dashboard-container-title MLH Info (checked in) - %table.stats.datatable.table.table-striped.table-hover{ "data-source" => mlh_info_checked_in_manage_stats_path(format: :json) } + %table.datatable.stats-mlhinfo-checkedin.table.table-striped.table-hover{ "data-source" => mlh_checked_in_datatable_manage_stats_path(format: :json) } %thead %tr + %th ID %th First name %th Last name %th Email + %th Phone %th School Name %tbody diff --git a/app/views/manage/trackable_events/index.html.haml b/app/views/manage/trackable_events/index.html.haml index ae63ad9ca..8a4f51b77 100644 --- a/app/views/manage/trackable_events/index.html.haml +++ b/app/views/manage/trackable_events/index.html.haml @@ -28,7 +28,7 @@ %td= trackable_event.trackable_tag.name %td= trackable_event.user.email %td= link_to 'Show', manage_trackable_event_path(trackable_event) - - if current_user.admin? || current_user == trackable_event.user + - if current_user.director? || current_user == trackable_event.user %td= link_to 'Edit', edit_manage_trackable_event_path(trackable_event) %td= link_to 'Destroy', manage_trackable_event_path(trackable_event), method: :delete, data: { confirm: 'Are you sure?' } - else diff --git a/app/views/manage/trackable_events/show.html.haml b/app/views/manage/trackable_events/show.html.haml index fca74599b..3933ba017 100644 --- a/app/views/manage/trackable_events/show.html.haml +++ b/app/views/manage/trackable_events/show.html.haml @@ -11,7 +11,7 @@ = link_to @trackable_event.trackable_tag.name, manage_trackable_tag_path(@trackable_event.trackable_tag) %p %b User: - = link_to @trackable_event.user.email, manage_admin_path(@trackable_event.user) + = link_to @trackable_event.user.email, manage_user_path(@trackable_event.user) = link_to 'Edit', edit_manage_trackable_event_path(@trackable_event) \| diff --git a/app/views/manage/trackable_tags/index.html.haml b/app/views/manage/trackable_tags/index.html.haml index 63a01917c..1dbc9f1a8 100644 --- a/app/views/manage/trackable_tags/index.html.haml +++ b/app/views/manage/trackable_tags/index.html.haml @@ -1,4 +1,4 @@ -= render "layouts/manage/page_title", title: "Trackable Tags" do += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.trackable-tags') do = link_to "New Tag", new_manage_trackable_tag_path, class: "btn btn-sm btn-outline-secondary" %table.table.table-striped diff --git a/app/views/manage/trackable_tags/show.html.haml b/app/views/manage/trackable_tags/show.html.haml index c9ad2ece3..a25899c6f 100644 --- a/app/views/manage/trackable_tags/show.html.haml +++ b/app/views/manage/trackable_tags/show.html.haml @@ -34,7 +34,7 @@ %td= trackable_event.band_id %td= trackable_event.user.email %td - - if current_user.admin? || current_user == trackable_event.user + - if current_user.director? || current_user == trackable_event.user = link_to 'Edit', edit_manage_trackable_event_path(trackable_event) .row.mt-2.mb-4 diff --git a/app/views/manage/users/_form.html.haml b/app/views/manage/users/_form.html.haml new file mode 100644 index 000000000..ca1af575d --- /dev/null +++ b/app/views/manage/users/_form.html.haml @@ -0,0 +1,15 @@ +.form-container + = bs_horizontal_simple_form_for @user, url: url_for(action: "update", controller: "users"), html: { "data-validate" => "form" } do |f| + + - if f.error_notification.present? + #disclaimer + = f.error_notification + + .form-inputs + = f.input :email, input_html: { "data-validate" => "presence" }, required: true + = f.input :role, collection: User.roles.to_a.collect{|c| [c[0].titleize, c[0]]}, include_blank: false + = f.input :is_active, collection: [[t(:active, scope: "pages.manage.users.edit.form"), true], [t(:inactive, scope: "pages.manage.users.edit.form"), false]], as: :radio_buttons + = f.input :receive_weekly_report, collection: [[t(:yes, scope: "pages.manage.users.edit.form"), true], [t(:no, scope: "pages.manage.users.edit.form"), false]], as: :radio_buttons + + .center + = f.button :submit, value: ( t(:save, scope: "pages.manage.users.edit.form") ), class: 'btn-primary' diff --git a/app/views/manage/users/edit.html.haml b/app/views/manage/users/edit.html.haml new file mode 100644 index 000000000..f2f911fa0 --- /dev/null +++ b/app/views/manage/users/edit.html.haml @@ -0,0 +1,6 @@ += render "layouts/manage/page_title", title: t(:title, scope: "pages.manage.users.edit", user_email: @user.email), subtitle: @user.email do + .btn-group + = link_to t(:cancel, scope: "pages.manage.users.edit"), manage_user_path(@user), class: 'btn btn-sm btn-outline-secondary' + = link_to t(:delete, scope: "pages.manage.users.edit"), manage_user_path(@user), method: :delete, data: { confirm: "Are you sure? #{@user.email} will be permanently deleted. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary' + += render 'form' diff --git a/app/views/manage/users/index.html.haml b/app/views/manage/users/index.html.haml new file mode 100644 index 000000000..0b9b8a286 --- /dev/null +++ b/app/views/manage/users/index.html.haml @@ -0,0 +1,47 @@ += render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.users') + +.row + .col + %h5.dashboard-container-title + = t(:users, scope: 'pages.manage.users') + %table.users.datatable.table.table-striped.table-hover{ "data-source" => user_datatable_manage_users_path(format: :json) } + %thead + %tr + %th= t(:id, scope: 'pages.manage.users.table') + %th + %th= t(:first_name, scope: 'pages.manage.users.table') + %th= t(:last_name, scope: 'pages.manage.users.table') + %th= t(:email, scope: 'pages.manage.users.table') + %th= t(:role, scope: 'pages.manage.users.table') + %th= t(:questionnaire, scope: 'pages.manage.users.table') + %th= t(:login_access, scope: 'pages.manage.users.table') + %th= t(:registered_on, scope: 'pages.manage.users.table') + %th= t(:signed_in_on, scope: 'pages.manage.users.table') + %th= t(:previous_signed_in_on, scope: 'pages.manage.users.table') + %th= t(:signed_in_ip, scope: 'pages.manage.users.table') + %th= t(:previous_signed_in_ip, scope: 'pages.manage.users.table') + %th= t(:sign_in_count, scope: 'pages.manage.users.table') + %tbody + +.row + .col + %h5.dashboard-container-title + = t(:staff, scope: 'pages.manage.users', hackathon_name: HackathonConfig['name']) + %table.staff.datatable.table.table-striped.table-hover{ "data-source" => staff_datatable_manage_users_path(format: :json) } + %thead + %tr + %th= t(:id, scope: 'pages.manage.users.table') + %th + %th= t(:first_name, scope: 'pages.manage.users.table') + %th= t(:last_name, scope: 'pages.manage.users.table') + %th= t(:email, scope: 'pages.manage.users.table') + %th= t(:role, scope: 'pages.manage.users.table') + %th= t(:login_access, scope: 'pages.manage.users.table') + %th= t(:weekly_report, scope: 'pages.manage.users.table') + %th= t(:registered_on, scope: 'pages.manage.users.table') + %th= t(:signed_in_on, scope: 'pages.manage.users.table') + %th= t(:previous_signed_in_on, scope: 'pages.manage.users.table') + %th= t(:signed_in_ip, scope: 'pages.manage.users.table') + %th= t(:previous_signed_in_ip, scope: 'pages.manage.users.table') + %th= t(:sign_in_count, scope: 'pages.manage.users.table') + %tbody diff --git a/app/views/manage/users/show.html.haml b/app/views/manage/users/show.html.haml new file mode 100644 index 000000000..7b3387e32 --- /dev/null +++ b/app/views/manage/users/show.html.haml @@ -0,0 +1,59 @@ += render "layouts/manage/page_title", title: t(:title, scope: "pages.manage.users.show", user_email: @user.email) do + .btn-group + = link_to t(:edit, scope: "pages.manage.users.show"), edit_manage_user_path(@user), class: 'btn btn-sm btn-outline-secondary' + = link_to t(:delete, scope: "pages.manage.users.show"), manage_user_path(@user), method: :delete, data: { confirm: "Are you sure? #{@user.email} along with their questionnaire will be permanently deleted. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary' + +.row.mt-2.mb-4 + .col-lg-6 + .card.mb-3 + .card-header= t(:user_information, scope: "pages.manage.users.show") + .card-body + .row + %dt.col-md-5= t(:email_address, scope: "pages.manage.users.show") + %dd.col-md-7= @user.email + .row + %dt.col-md-5= t(:role, scope: "pages.manage.users.show") + %dd.col-md-7= @user.role.titleize + .row + %dt.col-md-5= t(:login_access, scope: "pages.manage.users.show") + %dd.col-md-7 + - if @user.is_active + %span.badge.badge-success= t(:active, scope: "pages.manage.users.show") + - else + %span.badge.badge-danger= t(:inactive, scope: "pages.manage.users.show") + .row + %dt.col-md-5= t(:receive_weekly_report, scope: "pages.manage.users.show") + %dd.col-md-7 + - if @user.receive_weekly_report + %span.badge.badge-success= t(:yes, scope: "pages.manage.users.show") + - if !@user.is_active + %br + %small + %span.fa.fa-info-circle.icon-space-r-half + = t(:inactive_warning, scope: "pages.manage.users.show") + - else + %span.badge.badge-secondary= t(:no, scope: "pages.manage.users.show") + .row + %dt.col-md-5= t(:registered, scope: "pages.manage.users.show") + %dd.col-md-7= display_datetime(@user.created_at) + .row + %dt.col-md-5= t(:signed_in_on, scope: "pages.manage.users.show") + %dd.col-md-7= display_datetime(@user.current_sign_in_at) + .row + %dt.col-md-5= t(:previous_signed_in_on, scope: "pages.manage.users.show") + %dd.col-md-7= display_datetime(@user.last_sign_in_at) + .row + %dt.col-md-5= t(:signed_in_ip, scope: "pages.manage.users.show") + %dd.col-md-7= @user.current_sign_in_ip == "::1" ? "127.0.0.1" : @user.current_sign_in_ip + .row + %dt.col-md-5= t(:previous_signed_in_ip, scope: "pages.manage.users.show") + %dd.col-md-7= @user.last_sign_in_ip == "::1" ? "127.0.0.1" : @user.last_sign_in_ip + .row + %dt.col-md-5= t(:sign_in_count, scope: "pages.manage.users.show") + %dd.col-md-7= @user.sign_in_count + + .col-lg-6 + .card.mb-3 + .card-header= t(:change_history, scope: "pages.manage.users.show") + .card-body.pb-2 + = render "model_history", model: @user diff --git a/app/views/questionnaires/_form.html.haml b/app/views/questionnaires/_form.html.haml index fefc59e30..b895acebe 100644 --- a/app/views/questionnaires/_form.html.haml +++ b/app/views/questionnaires/_form.html.haml @@ -10,19 +10,13 @@ = markdown(HackathonConfig['disclaimer_message']) .form-inputs - = f.input :first_name, input_html: { "data-validate" => "presence" }, autofocus: true, wrapper_html: { class: 'input--half' } - = f.input :last_name, input_html: { "data-validate" => "presence" }, wrapper_html: { class: 'input--half' } - = f.input :phone, label: "Phone number", input_html: { "data-validate" => "presence" } + = f.input :phone, label: "Phone number", input_html: { "data-validate" => ["presence", "phone"] } = f.input :date_of_birth, start_year: Date.today.year - 5, end_year: Date.today.year - 90, order: [:month, :day, :year], input_html: { "data-validate" => "presence" } = f.input :school_id, as: :school_selection, input_html: { "data-validate" => "presence" } = f.input :level_of_study, collection: collection_or_text(@questionnaire.level_of_study, Questionnaire::POSSIBLE_LEVELS_OF_STUDY), include_blank: "(select one...)", input_html: { "data-validate" => "presence" }, wrapper_html: { class: 'input--half' } = f.input :major, input_html: { "data-validate" => "presence" }, wrapper_html: { class: 'input--half' } = f.input :gender, collection: collection_or_text(@questionnaire.gender, Questionnaire::POSSIBLE_GENDERS), include_blank: "(select one...)", input_html: { "data-validate" => "presence" }, wrapper_html: { class: 'input--half' } - = f.input :shirt_size, as: :select, collection: Questionnaire::POSSIBLE_SHIRT_SIZES, include_blank: "(select one...)", input_html: { "data-validate" => "presence" }, wrapper_html: { class: 'input--half' } - = f.input :dietary_restrictions, as: :text, label: "Health restrictions", wrapper_html: { class: 'input--half' }, maxlength: Questionnaire::DIETARY_SPECIAL_NEEDS_MAX_LENGTH - = f.input :special_needs, as: :text, label: "Special needs", wrapper_html: { class: 'input--half' }, maxlength: Questionnaire::DIETARY_SPECIAL_NEEDS_MAX_LENGTH - .right %button.button{ type: "button", "data-wizard" => "next" } Next @@ -46,6 +40,10 @@ = f.input :travel_not_from_school, as: :radio_buttons, collection: { " My school" => false, " Somewhere else" => true }, label: "I am traveling from..." = f.input :travel_location, input_html: { "data-validate" => "presence", disabled: !travel_state }, wrapper_html: { style: travel_state ? "" : "display: none" }, label: "Where are you traveling from?", placeholder: "New York City" + = f.input :shirt_size, as: :select, collection: Questionnaire::POSSIBLE_SHIRT_SIZES, include_blank: "(select one...)", input_html: { "data-validate" => "presence" } + = f.input :dietary_restrictions, as: :text, label: "Health restrictions", wrapper_html: { class: 'input--half' }, maxlength: Questionnaire::DIETARY_SPECIAL_NEEDS_MAX_LENGTH + = f.input :special_needs, as: :text, label: "Special needs", wrapper_html: { class: 'input--half' }, maxlength: Questionnaire::DIETARY_SPECIAL_NEEDS_MAX_LENGTH + %hr .form-inputs diff --git a/app/views/questionnaires/new.html.haml b/app/views/questionnaires/new.html.haml index 45cd8202d..6d389312f 100644 --- a/app/views/questionnaires/new.html.haml +++ b/app/views/questionnaires/new.html.haml @@ -1,7 +1,23 @@ -- title "Apply" -.form-container - %h1.section-title - Apply for - %span.emphasized= HackathonConfig['name'] +- title "Application" +- if HackathonConfig['accepting_questionnaires'] + .form-container + %h1.section-title + Apply for + %span.emphasized= HackathonConfig['name'] + = render 'form' +- else + .form-container + #disclaimer + %h1.section-title + Applications Closed + %p + - if HackathonConfig['questionnaires_closed_message'].present? + = markdown(HackathonConfig['questionnaires_closed_message']) + - else + Sorry, we are no longer accepting new applications to + %strong + #{HackathonConfig['name']}. + %br + %p.session-link.right + Don't need your account? #{link_to "Delete my account", user_registration_path, data: { confirm: "Are you sure? Your account and any related data will be permanently erased." }, method: :delete} -= render 'form' diff --git a/app/views/questionnaires/show.html.haml b/app/views/questionnaires/show.html.haml index 057f4472f..3719d0d9e 100644 --- a/app/views/questionnaires/show.html.haml +++ b/app/views/questionnaires/show.html.haml @@ -27,7 +27,7 @@ %p.center = btn_link_to "RSVP NOW »".html_safe, rsvp_path - if !@questionnaire.can_rsvp? && @questionnaire.acc_status != "denied" - - if HackathonConfig['registration_is_open'] + - if HackathonConfig['accepting_questionnaires'] - if HackathonConfig['thanks_for_applying_message'].present? = markdown(HackathonConfig['thanks_for_applying_message']) - else diff --git a/app/views/staff_mailer/bus_captain_left.html.haml b/app/views/staff_mailer/bus_captain_left.html.haml new file mode 100644 index 000000000..7df0d04e8 --- /dev/null +++ b/app/views/staff_mailer/bus_captain_left.html.haml @@ -0,0 +1 @@ +%p Alert #{@former_captain.full_name} (#{@former_captain.email}) is no longer a bus captain for #{@bus_route.name} diff --git a/app/views/admin_mailer/weekly_report.haml b/app/views/staff_mailer/weekly_report.haml similarity index 100% rename from app/views/admin_mailer/weekly_report.haml rename to app/views/staff_mailer/weekly_report.haml diff --git a/config/app.yml b/config/app.yml index 1ddd64947..23057decb 100644 --- a/config/app.yml +++ b/config/app.yml @@ -2,11 +2,10 @@ defaults: &defaults # Logic config - registration_is_open: true + accepting_questionnaires: true last_day_to_apply: "<%= Date.new(2000, 1, 1).to_s %>" event_start_date: "<%= Date.new(2000, 1, 1).to_s %>" auto_late_waitlist: false - disable_account_registration: false # Content config name: HackFoo @@ -22,6 +21,7 @@ defaults: &defaults disclaimer_message: "" thanks_for_applying_message: "" thanks_for_rsvp_message: "" + questionnaires_closed_message: "" bus_captain_notes: "" custom_css: "" diff --git a/config/environments/production.rb b/config/environments/production.rb index 31cad31b3..7bf65ff0b 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -106,8 +106,12 @@ enable_starttls_auto: ENV["SMTP_STARTTLS_AUTO"] != "false", # defaults to true } else - # Send email through SparkPost API - config.action_mailer.delivery_method = :sparkpost + # Send email through SendGrid API + config.action_mailer.delivery_method = :sendgrid_actionmailer + config.action_mailer.sendgrid_actionmailer_settings = { + api_key: ENV['SENDGRID_API_KEY'], + raise_delivery_errors: true + } end # Required for email messages diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 591199ccb..1109083b9 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -18,7 +18,7 @@ # every time somebody will try to access the admin web interface. admin_authenticator do if current_user - head :forbidden unless current_user.admin? || current_user.admin_limited_access? + head :forbidden unless current_user.director? || current_user.organizer? else redirect_to new_user_session_url end diff --git a/config/initializers/sparkpost_rails.rb b/config/initializers/sparkpost_rails.rb deleted file mode 100644 index cdea40fa0..000000000 --- a/config/initializers/sparkpost_rails.rb +++ /dev/null @@ -1,7 +0,0 @@ -SparkPostRails.configure do |c| - c.api_key = ENV['SPARKPOST_API_KEY'] - c.track_opens = true - c.track_clicks = true - c.campaign_id = ENV['SPARKPOST_CAMPAIGN_ID'] - c.html_content_only = true -end diff --git a/config/locales/en.yml b/config/locales/en.yml index 9a13eb5b5..d3bd02c54 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -47,7 +47,7 @@ en: user: role: Limited access prevents the admin from adding, modifying, or deleting any records; modifications through the check-in process are allowed. Event tracking limits to only event tracking. is_active: Deactivating a user will prevent them from logging in. Their access will be immediately revoked from the admin and application pages. - receive_weekly_report: A weekly email report on admissions, bus lists, and messages. Only sent when there are weekly updates up until 7 days past the event. Disabled for inactive admins. + receive_weekly_report: A weekly email report on admissions, bus lists, and messages. Only sent when there are weekly updates up until 7 days past the event. Disabled for inactive staff members. message: type: Bulk emails are sent once, manually. Automated emails are sent upon a desired trigger/event. name: A friendly name to recognize this email. Applicants won't see this. @@ -55,11 +55,10 @@ en: school: is_home: The "home" school is separated from all other schools on dashboard metrics. hackathon_config: - registration_is_open: Specify that registration is open. This does not block registration; it only changes messaging around it. + accepting_questionnaires: Specify and allow questionnaires to be accepted. last_day_to_apply: 'Last date to apply to your hackathon (format: YYYY-MM-DD)' event_start_date: 'Start date of your hackathon (format: YYYY-MM-DD)' auto_late_waitlist: Automatically set application status to "late waitlist" for new applications - disable_account_registration: Prevent applicants from applying name: Your hackathon's name logo_asset: Optional logo asset (should be a full https:// URL to a .jpg, .png, or .svg file) @@ -73,6 +72,7 @@ en: disclaimer_message: Optional message that appears before signing up & applying. Supports markdown. thanks_for_applying_message: Optional message that appears after completing an application. Supports markdown. thanks_for_rsvp_message: Optional message that appears after RSVP'ing as attending. Supports markdown. + questionnaires_closed_message: Message that replaces the new questionnaire form. Supports markdown. bus_captain_notes: Optional message that appears on the bus captain's bus list page. Supports markdown. custom_css: CSS to inject into the <head> of every public page placeholders: @@ -92,8 +92,6 @@ en: Contact [travel@example.com](mailto:travel@example.com) questionnaire: - first_name: Joe - last_name: Smith email: joe@example.com phone: (123) 456-7890 school_id: My University @@ -105,6 +103,8 @@ en: portfolio_url: https://mywebsite.com vcs_url: https://github.com/coderit user: + first_name: Joe + last_name: Smith email: joe@example.com labels: school: @@ -118,3 +118,95 @@ en: custom_css: Custom CSS homepage_url: Homepage URL thanks_for_rsvp_message: Thanks For RSVP Message + questionnaires_closed_message: Questionnaires Closed Message + pages: + manage: + dashboard: + title: Dashboard + questionnaires: + title: Questionnaires + messages: + title: Messages + check-in: + title: Check-in + stats: + title: Statistics + trackable-tags: + title: Trackable Tags + bus-lists: + title: Bus Lists + schools: + title: Schools + users: + title: Users & Staff + users: All Users + staff: "%{hackathon_name} Staff" + table: + id: ID + email: Email + role: Role + questionnaire: Questionnaire + login_access: Login access + weekly_report: Weekly report + registered_on: Registered on + signed_in_on: Signed-in on + previous_signed_in_on: Previous signed-in on + signed_in_ip: Signed-in ip + previous_signed_in_ip: Previous signed-in IP + sign_in_count: Sign-in count + show: + title: "%{user_email}" + edit: Edit + reset_password: Reset Password + delete: Delete + user_information: User Information + email_address: Email address + role: Role + login_access: Login access + active: Active + inactive: Inactive + receive_weekly_report: Receive weekly report + yes: Yes + no: No + inactive_warning: Will not receive while user is inactive + registered: Registered + signed_in_on: Signed-in on + previous_signed_in_on: Previous signed-in on + signed_in_ip: Signed-in ip + previous_signed_in_ip: Previous signed-in IP + sign_in_count: Sign-in count + change_history: Change History + edit: + title: Edit User + subtitle: "%{user_email}" + cancel: Cancel + delete: Delete + form: + active: Active + inactive: Inactive + yes: Yes + no: No + save: Save + settings: + title: Hackathon Settings + sidekiq: + title: Sidekiq + blazer: + title: Blazer + doorkeeper: + title: Doorkeeper + data-exports: + title: Data Exports + layouts: + manage: + navigation: + overview: Overview + logistics: Logistics + travel: Travel + administration: Administration + advanced: Advanced + descriptors: + sidekiq: Monitor background jobs + blazer: Run custom SQL queries + doorkeeper: OAuth2 provider management + dataexports: Generate & export data diff --git a/config/routes.rb b/config/routes.rb index bc8661abe..9bf7f5c52 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,9 +9,17 @@ mount MailPreview => "mail_view" if Rails.env.development? - root to: "questionnaires#show" + devise_scope :user do + authenticated do + root to: "questionnaires#show" + end + + unauthenticated do + root to: "devise/sessions#new" + end + end - authenticate :user, ->(u) { u.admin? } do + authenticate :user, ->(u) { u.director? } do mount Sidekiq::Web => "/sidekiq" mount Blazer::Engine, at: "blazer" end @@ -30,7 +38,15 @@ end namespace :manage do - root to: "dashboard#index" + authenticate :user, ->(u) { u.director? } do + root to: "dashboard#index" + end + authenticate :user, ->(u) { u.organizer? } do + root to: "dashboard#index" + end + authenticate :user, ->(u) { u.volunteer? } do + root to: "checkins#index" + end resources :dashboard do get :map_data, on: :collection get :todays_activity_data, on: :collection @@ -47,16 +63,16 @@ resources :questionnaires do post :datatable, on: :collection patch :check_in, on: :member - patch :convert_to_admin, on: :member patch :update_acc_status, on: :member patch :bulk_apply, on: :collection - get :message_events, on: :member end resources :checkins do post :datatable, on: :collection end - resources :admins do - post :datatable, on: :collection + resources :users do + post :user_datatable, on: :collection + post :staff_datatable, on: :collection + patch :reset_password, on: :member end resources :messages do get :preview, on: :member @@ -80,11 +96,11 @@ patch :perform_merge, on: :member end resources :stats do - post :dietary_special_needs, on: :collection - post :sponsor_info, on: :collection - post :alt_travel, on: :collection - post :mlh_info_applied, on: :collection - post :mlh_info_checked_in, on: :collection + post :dietary_restrictions_special_needs_datatable, on: :collection + post :alt_travel_datatable, on: :collection + post :attendee_sponsor_info_datatable, on: :collection + post :mlh_applied_datatable, on: :collection + post :mlh_checked_in_datatable, on: :collection end resources :configs do patch :update_only_css_variables, on: :member diff --git a/config/schedule.yml b/config/schedule.yml index 7035ecc3f..520cc4fe0 100644 --- a/config/schedule.yml +++ b/config/schedule.yml @@ -1,3 +1,3 @@ -admin_weekly_report: +staff_weekly_report: cron: '0 8 * * MON' - class: 'AdminWeeklyReportJob' + class: 'StaffWeeklyReportJob' diff --git a/db/fips.csv b/db/fips.csv new file mode 100644 index 000000000..80dccc2bf --- /dev/null +++ b/db/fips.csv @@ -0,0 +1,2359 @@ +fips_code,city,state +1003,Daphne,Alabama +1003,Orange Beach,Alabama +1015,Jacksonville,Alabama +1031,Enterprise,Alabama +1033,Muscle Shoals,Alabama +1039,Andalusia,Alabama +1043,Hanceville,Alabama +1045,Dothan,Alabama +1047,Selma,Alabama +1051,Deatsville,Alabama +1053,Brewton,Alabama +1055,Gadsden,Alabama +1071,Rainsville,Alabama +1073,Bessemer,Alabama +1073,Birmingham,Alabama +1073,Fairfield,Alabama +1077,Florence,Alabama +1081,Auburn University,Alabama +1083,Athens,Alabama +1083,Tanner,Alabama +1089,Huntsville,Alabama +1095,Boaz,Alabama +1097,Mobile,Alabama +1099,Monroeville,Alabama +1101,Montgomery,Alabama +1105,Marion,Alabama +1109,Troy,Alabama +1111,Wadley,Alabama +1113,Phenix City,Alabama +1117,Montevallo,Alabama +1119,Livingston,Alabama +1121,Talladega,Alabama +1123,Alexander City,Alabama +1125,Tuscaloosa,Alabama +1127,Jasper,Alabama +2020,Anchorage,Alaska +2090,Fairbanks,Alaska +2110,Juneau,Alaska +2122,Soldotna,Alaska +2170,Palmer,Alaska +2185,Barrow,Alaska +2261,Valdez,Alaska +4003,Douglas,Arizona +4005,Flagstaff,Arizona +4009,Thatcher,Arizona +4013,Avondale,Arizona +4013,Chandler,Arizona +4013,Glendale,Arizona +4013,Mesa,Arizona +4013,Phoenix,Arizona +4013,Scottsdale,Arizona +4013,"Suite B-104""",Tempe +4013,Tempe,Arizona +4015,Kingman,Arizona +4017,Holbrook,Arizona +4019,Tucson,Arizona +4021,Coolidge,Arizona +4025,Prescott,Arizona +4025,Prescott Valley,Arizona +4027,Yuma,Arizona +5005,Mountain Home,Arkansas +5007,Bentonville,Arkansas +5007,Rogers,Arkansas +5007,Siloam Springs,Arkansas +5007,Springdale,Arkansas +5009,Harrison,Arkansas +5013,Camden,Arkansas +5019,Arkadelphia,Arkansas +5027,Magnolia,Arkansas +5029,Morrilton,Arkansas +5031,Jonesboro,Arkansas +5035,West Memphis,Arkansas +5043,Monticello,Arkansas +5045,Conway,Arkansas +5051,Hot Springs,Arkansas +5055,Paragould,Arkansas +5057,Hope,Arkansas +5059,Malvern,Arkansas +5063,Batesville,Arkansas +5065,Melbourne,Arkansas +5067,Newport,Arkansas +5069,Pine Bluff,Arkansas +5071,Clarksville,Arkansas +5075,Walnut Ridge,Arkansas +5093,Blytheville,Arkansas +5107,Helena,Arkansas +5113,Mena,Arkansas +5115,Russellville,Arkansas +5119,Little Rock,Arkansas +5119,N Little Rock,Arkansas +5119,North Little Rock,Arkansas +5121,Pocahontas,Arkansas +5123,Forrest City,Arkansas +5131,Fort Smith,Arkansas +5133,De Queen,Arkansas +5139,El Dorado,Arkansas +5143,Fayetteville,Arkansas +5145,Beebe,Arkansas +5145,Searcy,Arkansas +6001,Alameda,California +6001,Berkeley,California +6001,Emeryville,California +6001,Fremont,California +6001,Hayward,California +6001,Livermore,California +6001,Oakland,California +6007,Chico,California +6007,Oroville,California +6013,Antioch,California +6013,Concord,California +6013,Martinez,California +6013,Moraga,California +6013,Pittsburg,California +6013,Pleasant Hill,California +6013,San Pablo,California +6017,South Lake Tahoe,California +6019,Clovis,California +6019,Coalinga,California +6019,Fresno,California +6019,Reedley,California +6023,Arcata,California +6023,Blue Lake,California +6023,Eureka,California +6025,Calexico,California +6025,Imperial,California +6029,Bakersfield,California +6029,Ridgecrest,California +6029,Taft,California +6031,Lemoore,California +6035,Susanville,California +6037,Azusa,California +6037,Beverly Hills,California +6037,Burbank,California +6037,Carson,California +6037,Cerritos,California +6037,Chatsworth,California +6037,City of Industry,California +6037,Claremont,California +6037,Commerce,California +6037,Compton,California +6037,Culver City,California +6037,Downey,California +6037,Duarte,California +6037,Glendora,California +6037,Hollywood,California +6037,Huntington Park,California +6037,Inglewood,California +6037,Irwindale,California +6037,La Mirada,California +6037,La Verne,California +6037,Lancaster,California +6037,Long Beach,California +6037,Los Angeles,California +6037,Malibu,California +6037,Monrovia,California +6037,Monterey Park,California +6037,North Hollywood,California +6037,Northridge,California +6037,Norwalk,California +6037,Pasadena,California +6037,Pomona,California +6037,Rancho Palos Verdes,California +6037,Reseda,California +6037,Rosemead,California +6037,San Dimas,California +6037,Santa Clarita,California +6037,Santa Monica,California +6037,Signal Hill,California +6037,South Gate,California +6037,Sylmar,California +6037,Tarzana,California +6037,Torrance,California +6037,Valencia,California +6037,Valley Glen,California +6037,Van Nuys,California +6037,Walnut,California +6037,Whittier,California +6037,Wilmington,California +6037,Woodland Hills,California +6041,Kentfield,California +6041,San Anselmo,California +6041,San Rafael,California +6045,Ukiah,California +6047,Merced,California +6053,Monterey,California +6053,Salinas,California +6053,Seaside,California +6055,Angwin,California +6055,Napa,California +6059,Aliso Viejo,California +6059,Anaheim,California +6059,Costa Mesa,California +6059,Cypress,California +6059,Fountain Valley,California +6059,Fullerton,California +6059,Huntington Beach,California +6059,Irvine,California +6059,Laguna Beach,California +6059,Laguna Hills,California +6059,Mission Viejo,California +6059,Newport Beach,California +6059,Orange,California +6059,Santa Ana,California +6061,Rocklin,California +6061,Roseville,California +6063,Quincy,California +6065,Blythe,California +6065,Cathedral City,California +6065,Corona,California +6065,Moreno Valley,California +6065,Murrieta,California +6065,Norco,California +6065,Palm Desert,California +6065,Palm Springs,California +6065,Riverside,California +6065,San Jacinto,California +6065,Temecula,California +6067,Folsom,California +6067,Gold River,California +6067,Rancho Cordova,California +6067,Sacramento,California +6071,Barstow,California +6071,Hesperia,California +6071,Joshua Tree,California +6071,Loma Linda,California +6071,Ontario,California +6071,Rancho Cucamonga,California +6071,Redlands,California +6071,San Bernardino,California +6071,Upland,California +6071,Victorville,California +6071,Yucaipa,California +6073,Chula Vista,California +6073,El Cajon,California +6073,Escondido,California +6073,La Jolla,California +6073,Majuro,Marshall Islands +6073,National City,California +6073,Oceanside,California +6073,Poway,California +6073,San Diego,California +6073,San Marcos,California +6073,Vista,California +6075,San Francisco,California +6077,Lathrop,California +6077,Stockton,California +6079,San Luis Obispo,California +6081,Atherton,California +6081,Belmont,California +6081,Redwood City,California +6081,San Bruno,California +6081,San Mateo,California +6083,Carpinteria,California +6083,Santa Barbara,California +6083,Santa Maria,California +6085,Cupertino,California +6085,Gilroy,California +6085,Los Altos Hills,California +6085,Milpitas,California +6085,Palo Alto,California +6085,San Jose,California +6085,Santa Clara,California +6085,Saratoga,California +6085,Sunnyvale,California +6087,Aptos,California +6087,Santa Cruz,California +6089,Redding,California +6093,Weed,California +6095,Fairfield,California +6095,Vallejo,California +6097,Rohnert Park,California +6097,Santa Rosa,California +6099,Modesto,California +6099,Salida,California +6099,Turlock,California +6101,Yuba City,California +6107,Porterville,California +6107,Visalia,California +6109,Sonora,California +6111,Camarillo,California +6111,Moorpark,California +6111,Oxnard,California +6111,Thousand Oaks,California +6111,Ventura,California +6113,Davis,California +6113,West Sacramento,California +6113,Woodland,California +6115,Marysville,California +8001,Thornton,Colorado +8001,Westminster,Colorado +8003,Alamosa,Colorado +8005,Aurora,Colorado +8005,Centennial,Colorado +8005,Denver,Colorado +8005,Greenwood Village,Colorado +8005,Littleton,Colorado +8013,Boulder,Colorado +8013,Longmont,Colorado +8014,Broomfield,Colorado +8035,Lone Tree,Colorado +8035,Parker,Colorado +8041,Colorado Springs,Colorado +8045,Glenwood Springs,Colorado +8051,Gunnison,Colorado +8059,Golden,Colorado +8059,Lakewood,Colorado +8067,Durango,Colorado +8069,Fort Collins,Colorado +8071,Trinidad,Colorado +8075,Sterling,Colorado +8077,Grand Junction,Colorado +8087,Fort Morgan,Colorado +8089,La Junta,Colorado +8099,Lamar,Colorado +8101,Pueblo,Colorado +8103,Rangely,Colorado +8119,Woodland Park,Colorado +8123,Greeley,Colorado +9001,Bridgeport,Connecticut +9001,Danbury,Connecticut +9001,Fairfield,Connecticut +9001,Norwalk,Connecticut +9001,Stamford,Connecticut +9001,Stratford,Connecticut +9003,East Hartford,Connecticut +9003,East Windsor,Connecticut +9003,Enfield,Connecticut +9003,Farmington,Connecticut +9003,Hartford,Connecticut +9003,Manchester,Connecticut +9003,New Britain,Connecticut +9003,Southington,Connecticut +9003,Suffield,Connecticut +9003,West Hartford,Connecticut +9005,Winsted,Connecticut +9007,Cromwell,Connecticut +9007,Middletown,Connecticut +9009,Hamden,Connecticut +9009,New Haven,Connecticut +9009,Waterbury,Connecticut +9009,West Haven,Connecticut +9011,Groton,Connecticut +9011,New London,Connecticut +9011,Norwich,Connecticut +9011,Old Lyme,Connecticut +9013,Storrs,Connecticut +9015,Danielson,Connecticut +9015,Willimantic,Connecticut +10001,Dover,Delaware +10003,New Castle,Delaware +10003,Newark,Delaware +10003,Wilmington,Delaware +10005,Lewes,Delaware +11001,Washington,District of Columbia +12001,Gainesville,Florida +12005,Panama City,Florida +12007,Starke,Florida +12009,Cocoa,Florida +12009,Melbourne,Florida +12011,Coconut Creek,Florida +12011,Davie,Florida +12011,Deerfield Beach,Florida +12011,Fort Lauderdale,Florida +12011,Hollywood,Florida +12011,Lauderhill,Florida +12011,Miramar,Florida +12011,Pembroke Pines,Florida +12011,Plantation,Florida +12011,Pompano Beach,Florida +12011,Weston,Florida +12015,Port Charlotte,Florida +12017,Inverness,Florida +12019,Orange Park,Florida +12021,Ave Maria,Florida +12021,Immokalee,Florida +12021,Naples,Florida +12023,Lake City,Florida +12031,Jacksonville,Florida +12033,Pensacola,Florida +12055,Avon Park,Florida +12057,Tampa,Florida +12057,Temple Terrace,Florida +12063,Graceville,Florida +12063,Marianna,Florida +12069,Eustis,Florida +12069,Leesburg,Florida +12071,Fort Myers,Florida +12073,Tallahassee,Florida +12079,Madison,Florida +12081,Bradenton,Florida +12083,Belleview,Florida +12083,Ocala,Florida +12085,Hobe Sound,Florida +12086,Coral Gables,Florida +12086,Cutler Bay,Florida +12086,Hialeah,Florida +12086,Homestead,Florida +12086,Miami,Florida +12086,Miami Beach,Florida +12086,Miami Gardens,Florida +12086,Miami Lakes,Florida +12086,North Miami,Florida +12087,Key West,Florida +12091,Fort Walton Beach,Florida +12091,Niceville,Florida +12095,Orlando,Florida +12095,Winter Garden,Florida +12095,Winter Park,Florida +12097,Celebration,Florida +12097,Kissimmee,Florida +12099,Boca Raton,Florida +12099,Boynton Beach,Florida +12099,Delray Beach,Florida +12099,Lake Worth,Florida +12099,Royal Palm Beach,Florida +12099,West Palm Beach,Florida +12101,New Port Richey,Florida +12101,Saint Leo,Florida +12101,Trinity,Florida +12103,Clearwater,Florida +12103,Largo,Florida +12103,Palm Harbor,Florida +12103,Saint Petersburg,Florida +12103,St. Petersburg,Florida +12105,Babson Park,Florida +12105,Lake Wales,Florida +12105,Lakeland,Florida +12105,Winter Haven,Florida +12107,Palatka,Florida +12109,Saint Augustine,Florida +12111,Fort Pierce,Florida +12111,Port Saint Lucie,Florida +12113,Milton,Florida +12115,Sarasota,Florida +12117,Altamonte Springs,Florida +12117,Apopka,Florida +12117,Casselberry,Florida +12117,Fern Park,Florida +12117,Heathrow,Florida +12117,Lake Mary,Florida +12117,Sanford,Florida +12127,Daytona Beach,Florida +12127,DeLand,Florida +12127,Ormond Beach,Florida +12131,DeFuniak Springs,Florida +12133,Chipley,Florida +13009,Milledgeville,Georgia +13021,Macon,Georgia +13023,Cochran,Georgia +13031,Statesboro,Georgia +13045,Carrollton,Georgia +13051,Savannah,Georgia +13057,Waleska,Georgia +13059,Athens,Georgia +13063,Morrow,Georgia +13067,Kennesaw,Georgia +13067,Marietta,Georgia +13067,Smyrna,Georgia +13069,Douglas,Georgia +13071,Moultrie,Georgia +13087,Bainbridge,Georgia +13089,Chamblee,Georgia +13089,Clarkston,Georgia +13089,Decatur,Georgia +13089,Lithonia,Georgia +13089,Tucker,Georgia +13095,Albany,Georgia +13097,Douglasville,Georgia +13107,Swainsboro,Georgia +13115,Mount Berry,Georgia +13115,Rome,Georgia +13119,Franklin Springs,Georgia +13121,Atlanta,Georgia +13121,Sandy Springs,Georgia +13127,Brunswick,Georgia +13135,Duluth,Georgia +13135,Lawrenceville,Georgia +13135,Lilburn,Georgia +13135,Norcross,Georgia +13137,Clarkesville,Georgia +13137,Demorest,Georgia +13139,Gainesville,Georgia +13139,Oakwood,Georgia +13143,Waco,Georgia +13153,Warner Robins,Georgia +13171,Barnesville,Georgia +13185,Valdosta,Georgia +13187,Dahlonega,Georgia +13209,Mount Vernon,Georgia +13215,Columbus,Georgia +13225,Fort Valley,Georgia +13243,Cuthbert,Georgia +13245,Augusta,Georgia +13255,Griffin,Georgia +13257,Toccoa Falls,Georgia +13261,Americus,Georgia +13275,Thomasville,Georgia +13277,Tifton,Georgia +13279,Vidalia,Georgia +13281,Young Harris,Georgia +13285,Lagrange,Georgia +13285,West Point,Georgia +13295,Lookout Mountain,Georgia +13299,Waycross,Georgia +13303,Sandersville,Georgia +13305,Jesup,Georgia +13311,Cleveland,Georgia +13313,Dalton,Georgia +15001,Hilo,Hawaii +15003,Honolulu,Hawaii +15003,Kaneohe,Hawaii +15003,Kapolei,Hawaii +15003,Laie,Hawaii +15003,Pearl City,Hawaii +15007,Lihue,Hawaii +15009,Kahului,Hawaii +16001,Boise,Idaho +16001,Meridian,Idaho +16005,Chubbuck,Idaho +16005,Pocatello,Idaho +16019,Idaho Falls,Idaho +16027,Caldwell,Idaho +16027,Nampa,Idaho +16031,Burley,Idaho +16053,Jerome,Idaho +16055,Coeur D Alene,Idaho +16055,Coeur d'Alene,Idaho +16057,Moscow,Idaho +16065,Rexburg,Idaho +16069,Lewiston,Idaho +16083,Twin Falls,Idaho +17001,Quincy,Illinois +17005,Greenville,Illinois +17019,Champaign,Illinois +17029,Charleston,Illinois +17029,Mattoon,Illinois +17031,Bedford Park,Illinois +17031,Bridgeview,Illinois +17031,Calumet City,Illinois +17031,Chicago,Illinois +17031,Chicago Heights,Illinois +17031,Cicero,Illinois +17031,Des Plaines,Illinois +17031,Evanston,Illinois +17031,Hillside,Illinois +17031,Hoffman Estates,Illinois +17031,Melrose Park,Illinois +17031,Mount Prospect,Illinois +17031,Palatine,Illinois +17031,Palos Heights,Illinois +17031,Palos Hills,Illinois +17031,River Forest,Illinois +17031,River Grove,Illinois +17031,Schaumburg,Illinois +17031,Skokie,Illinois +17031,South Holland,Illinois +17031,Wheeling,Illinois +17033,Robinson,Illinois +17037,Dekalb,Illinois +17037,Malta,Illinois +17043,Addison,Illinois +17043,Downers Grove,Illinois +17043,Elmhurst,Illinois +17043,Glen Ellyn,Illinois +17043,Glendale Heights,Illinois +17043,Lisle,Illinois +17043,Lombard,Illinois +17043,Naperville,Illinois +17043,Wheaton,Illinois +17043,Woodridge,Illinois +17057,Canton,Illinois +17077,Carbondale,Illinois +17081,Ina,Illinois +17083,Elsah,Illinois +17089,Aurora,Illinois +17089,Elgin,Illinois +17089,Sugar Grove,Illinois +17089,West Dundee,Illinois +17091,Bourbonnais,Illinois +17091,Kankakee,Illinois +17095,Galesburg,Illinois +17097,Deerfield,Illinois +17097,Grayslake,Illinois +17097,Lake Forest,Illinois +17097,Mundelein,Illinois +17097,North Chicago,Illinois +17099,Oglesby,Illinois +17103,Dixon,Illinois +17107,Lincoln,Illinois +17109,Macomb,Illinois +17111,Crystal Lake,Illinois +17113,Bloomington,Illinois +17113,Normal,Illinois +17115,Decatur,Illinois +17117,Carlinville,Illinois +17119,Collinsville,Illinois +17119,Edwardsville,Illinois +17119,Godfrey,Illinois +17121,Centralia,Illinois +17137,Jacksonville,Illinois +17143,Peoria,Illinois +17153,Ullin,Illinois +17159,Olney,Illinois +17161,Moline,Illinois +17161,Rock Island,Illinois +17163,Belleville,Illinois +17163,Fairview Heights,Illinois +17163,Lebanon,Illinois +17165,Harrisburg,Illinois +17167,Springfield,Illinois +17177,Freeport,Illinois +17179,East Peoria,Illinois +17183,Danville,Illinois +17185,Mount Carmel,Illinois +17187,Monmouth,Illinois +17191,Fairfield,Illinois +17195,Morrison,Illinois +17197,Joliet,Illinois +17197,Orland Park,Illinois +17197,Romeoville,Illinois +17197,Tinley Park,Illinois +17197,University Park,Illinois +17199,Carterville,Illinois +17201,Rockford,Illinois +17203,Eureka,Illinois +18003,Fort Wayne,Indiana +18019,Clarksville,Indiana +18019,Jeffersonville,Indiana +18035,Muncie,Indiana +18039,Elkhart,Indiana +18039,Goshen,Indiana +18043,New Albany,Indiana +18051,Oakland City,Indiana +18053,Marion,Indiana +18053,Upland,Indiana +18057,Carmel,Indiana +18067,Kokomo,Indiana +18069,Huntington,Indiana +18073,Rensselaer,Indiana +18077,Hanover,Indiana +18081,Franklin,Indiana +18081,Greenwood,Indiana +18083,Vincennes,Indiana +18085,Winona Lake,Indiana +18089,Evergreen,Alabama +18089,Gary,Indiana +18089,Hammond,Indiana +18089,Merrillville,Indiana +18089,Whiting,Indiana +18091,Michigan City,Indiana +18091,Westville,Indiana +18095,Anderson,Indiana +18097,Indianapolis,Indiana +18099,Donaldson,Indiana +18105,Bloomington,Indiana +18107,Crawfordsville,Indiana +18127,Valparaiso,Indiana +18133,Greencastle,Indiana +18141,Mishawaka,Indiana +18141,Notre Dame,Indiana +18141,South Bend,Indiana +18147,St. Meinrad,Indiana +18151,Angola,Indiana +18157,Lafayette,Indiana +18157,West Lafayette,Indiana +18163,Evansville,Indiana +18167,Saint Mary of the Woods,Indiana +18167,Terre Haute,Indiana +18169,North Manchester,Indiana +18173,Newburgh,Indiana +18177,Richmond,Indiana +19013,Cedar Falls,Iowa +19013,Waterloo,Iowa +19017,Waverly,Iowa +19021,Storm Lake,Iowa +19033,Mason City,Iowa +19045,Clinton,Iowa +19049,West Des Moines,Iowa +19053,Lamoni,Iowa +19057,West Burlington,Iowa +19059,Spirit Lake,Iowa +19061,Dubuque,Iowa +19061,Epworth,Iowa +19063,Estherville,Iowa +19065,Fayette,Iowa +19083,Iowa Falls,Iowa +19087,Mount Pleasant,Iowa +19089,Cresco,Iowa +19101,Fairfield,Iowa +19103,Iowa City,Iowa +19111,Fort Madison,Iowa +19113,Cedar Rapids,Iowa +19113,Mount Vernon,Iowa +19123,Oskaloosa,Iowa +19125,Pella,Iowa +19127,Marshalltown,Iowa +19153,Ankeny,Iowa +19153,Des Moines,Iowa +19153,Johnston,Iowa +19153,Urbandale,Iowa +19155,Council Bluffs,Iowa +19157,Grinnell,Iowa +19163,Bettendorf,Iowa +19163,Davenport,Iowa +19167,Orange City,Iowa +19167,Sheldon,Iowa +19167,Sioux Center,Iowa +19169,Ames,Iowa +19175,Creston,Iowa +19179,Ottumwa,Iowa +19181,Indianola,Iowa +19183,Kalona,Iowa +19187,Fort Dodge,Iowa +19189,Forest City,Iowa +19191,Calmar,Iowa +19191,Decorah,Iowa +19193,Sioux City,Iowa +20001,Iola,Kansas +20005,Atchison,Kansas +20009,Great Bend,Kansas +20011,Fort Scott,Kansas +20015,El Dorado,Kansas +20029,Concordia,Kansas +20035,Arkansas City,Kansas +20037,Pittsburg,Kansas +20045,Baldwin City,Kansas +20045,Lawrence,Kansas +20051,Hays,Kansas +20055,Garden City,Kansas +20057,Dodge City,Kansas +20059,Ottawa,Kansas +20079,Hesston,Kansas +20079,North Newton,Kansas +20091,Leawood,Kansas +20091,Lenexa,Kansas +20091,Olathe,Kansas +20091,Overland Park,Kansas +20091,Shawnee,Kansas +20097,Haviland,Kansas +20099,Parsons,Kansas +20103,Leavenworth,Kansas +20111,Emporia,Kansas +20113,Lindsborg,Kansas +20113,McPherson,Kansas +20115,Hillsboro,Kansas +20123,Beloit,Kansas +20125,Coffeyville,Kansas +20125,Independence,Kansas +20133,Chanute,Kansas +20151,Pratt,Kansas +20155,Hutchinson,Kansas +20159,Sterling,Kansas +20161,Manhattan,Kansas +20169,Salina,Kansas +20173,Wichita,Kansas +20175,Liberal,Kansas +20177,Topeka,Kansas +20181,Goodland,Kansas +20193,Colby,Kansas +20209,Kansas City,Kansas +21001,Columbia,Kentucky +21003,Scottsville,Kentucky +21009,Glasgow,Kentucky +21013,Middlesboro,Kentucky +21013,Pineville,Kentucky +21015,Florence,Kentucky +21019,Ashland,Kentucky +21021,Danville,Kentucky +21025,Vancleve,Kentucky +21035,Murray,Kentucky +21037,Bellevue,Kentucky +21037,Highland Heights,Kentucky +21037,Newport,Kentucky +21043,Grayson,Kentucky +21047,Hopkinsville,Kentucky +21051,Manchester,Kentucky +21059,Owensboro,Kentucky +21067,Lexington,Kentucky +21071,Prestonsburg,Kentucky +21073,Frankfort,Kentucky +21083,Mayfield,Kentucky +21089,Russell,Kentucky +21093,Elizabethtown,Kentucky +21095,Cumberland,Kentucky +21095,Harlan,Kentucky +21101,Henderson,Kentucky +21107,Madisonville,Kentucky +21111,Louisville,Kentucky +21113,Nicholasville,Kentucky +21113,Wilmore,Kentucky +21117,Crestview Hills,Kentucky +21117,Fort Mitchell,Kentucky +21119,Pippa Passes,Kentucky +21121,Barbourville,Kentucky +21131,Hyden,Kentucky +21145,Paducah,Kentucky +21151,Berea,Kentucky +21151,Richmond,Kentucky +21161,Maysville,Kentucky +21173,Mount Sterling,Kentucky +21193,Hazard,Kentucky +21195,Pikeville,Kentucky +21195,South Williamson,Kentucky +21199,Somerset,Kentucky +21205,Morehead,Kentucky +21209,Georgetown,Kentucky +21217,Campbellsville,Kentucky +21227,Bowling Green,Kentucky +21229,Saint Catharine,Kentucky +21235,Williamsburg,Kentucky +21239,Midway,Kentucky +21239,Versailles,Kentucky +22001,Eunice,Louisiana +22005,Sorrento,Louisiana +22015,Bossier City,Louisiana +22017,Shreveport,Louisiana +22019,Lake Charles,Louisiana +22033,Baton Rouge,Louisiana +22051,Kenner,Louisiana +22051,Metairie,Louisiana +22055,Lafayette,Louisiana +22057,Thibodaux,Louisiana +22061,Grambling,Louisiana +22061,Ruston,Louisiana +22069,Natchitoches,Louisiana +22071,New Orleans,Louisiana +22073,Monroe,Louisiana +22073,West Monroe,Louisiana +22079,Alexandria,Louisiana +22079,Pineville,Louisiana +22087,Chalmette,Louisiana +22089,Saint Rose,Louisiana +22101,Morgan City,Louisiana +22103,St. Benedict,Louisiana +22105,Hammond,Louisiana +22109,Schriever,Louisiana +22117,Bogalusa,Louisiana +22119,Minden,Louisiana +23001,Auburn,Maine +23001,Lewiston,Maine +23003,Fort Kent,Maine +23003,Presque Isle,Maine +23005,Bridgton,Maine +23005,Brunswick,Maine +23005,Portland,Maine +23005,S Portland,Maine +23005,South Portland,Maine +23005,Standish,Maine +23007,Farmington,Maine +23009,Bar Harbor,Maine +23009,Castine,Maine +23011,Augusta,Maine +23011,Waterville,Maine +23019,Bangor,Maine +23019,Orono,Maine +23025,Fairfield,Maine +23027,Unity,Maine +23029,Calais,Maine +23029,Machias,Maine +23031,Arundel,Maine +23031,Biddeford,Maine +23031,Wells,Maine +24001,Cumberland,Maryland +24001,Frostburg,Maryland +24003,Annapolis,Maryland +24003,Arnold,Maryland +24005,Owings Mills,Maryland +24005,Stevenson,Maryland +24005,Towson,Maryland +24013,Westminster,Maryland +24015,North East,Maryland +24017,La Plata,Maryland +24021,Emmitsburg,Maryland +24021,Frederick,Maryland +24023,McHenry,Maryland +24025,Bel Air,Maryland +24027,Columbia,Maryland +24029,Chestertown,Maryland +24031,Rockville,Maryland +24031,Silver Spring,Maryland +24031,Silver Spring,Maryland +24031,Takoma Park,Maryland +24033,Adelphi,Maryland +24033,Beltsville,Maryland +24033,Bowie,Maryland +24033,Capitol Heights,Maryland +24033,Landover,Maryland +24033,Lanham,Maryland +24033,Largo,Maryland +24033,Laurel,Maryland +24033,Suitland,Maryland +24035,Wye Mills,Maryland +24037,St. Mary's City,Maryland +24039,Princess Anne,Maryland +24043,Hagerstown,Maryland +24045,Salisbury,Maryland +24510,Baltimore,Maryland +25001,Buzzards Bay,Massachusetts +25001,Falmouth,Massachusetts +25001,West Barnstable,Massachusetts +25003,Great Barrington,Massachusetts +25003,North Adams,Massachusetts +25003,Pittsfield,Massachusetts +25003,Williamstown,Massachusetts +25005,Easton,Massachusetts +25005,Fall River,Massachusetts +25005,North Dartmouth,Massachusetts +25009,Andover,Massachusetts +25009,Beverly,Massachusetts +25009,Danvers,Massachusetts +25009,Haverhill,Massachusetts +25009,North Andover,Massachusetts +25009,Salem,Massachusetts +25009,South Hamilton,Massachusetts +25009,Swampscott,Massachusetts +25009,Wenham,Massachusetts +25011,Conway,Massachusetts +25011,Greenfield,Massachusetts +25013,Chicopee,Massachusetts +25013,Holyoke,Massachusetts +25013,Longmeadow,Massachusetts +25013,Springfield,Massachusetts +25013,Westfield,Massachusetts +25015,Amherst,Massachusetts +25015,Northampton,Massachusetts +25015,South Hadley,Massachusetts +25017,Bedford,Massachusetts +25017,Cambridge,Massachusetts +25017,Chestnut Hill,Massachusetts +25017,Framingham,Massachusetts +25017,Lowell,Massachusetts +25017,Medford,Massachusetts +25017,Newton,Massachusetts +25017,Newton Centre,Massachusetts +25017,Waltham,Massachusetts +25017,Weston,Massachusetts +25021,Braintree,Massachusetts +25021,Brookline,Massachusetts +25021,Chestnut Hill,Massachusetts +25021,Franklin,Massachusetts +25021,Milton,Massachusetts +25021,Needham,Massachusetts +25021,Norwood,Massachusetts +25021,Quincy,Massachusetts +25021,Wellesley,Massachusetts +25021,Wellesley Hills,Massachusetts +25023,Bridgewater,Massachusetts +25023,Brockton,Massachusetts +25025,Boston,Massachusetts +25025,Brighton,Massachusetts +25025,Roxbury Crossing,Massachusetts +25027,Dudley,Massachusetts +25027,Fitchburg,Massachusetts +25027,Gardner,Massachusetts +25027,Paxton,Massachusetts +25027,Worcester,Massachusetts +26007,Alpena,Michigan +26013,Baraga,Michigan +26017,University Center,Michigan +26021,Benton Harbor,Michigan +26025,Albion,Michigan +26025,Battle Creek,Michigan +26027,Dowagiac,Michigan +26033,Brimley,Michigan +26033,Sault Ste Marie,Michigan +26035,Harrison,Michigan +26041,Escanaba,Michigan +26045,Lansing,Michigan +26045,Olivet,Michigan +26047,Petoskey,Michigan +26049,Flint,Michigan +26049,Swartz Creek,Michigan +26053,Ironwood,Michigan +26055,Traverse City,Michigan +26057,Alma,Michigan +26061,Hancock,Michigan +26061,Houghton,Michigan +26073,Mount Pleasant,Michigan +26075,Jackson,Michigan +26075,Spring Arbor,Michigan +26077,Kalamazoo,Michigan +26081,Grand Rapids,Michigan +26081,Walker,Michigan +26081,Wyoming,Michigan +26091,Adrian,Michigan +26099,Clinton Township,Michigan +26103,Marquette,Michigan +26105,Scottville,Michigan +26107,Big Rapids,Michigan +26111,Midland,Michigan +26115,Monroe,Michigan +26117,Sidney,Michigan +26121,Muskegon,Michigan +26125,Auburn Hills,Michigan +26125,Bloomfield Hills,Michigan +26125,Farmington Hills,Michigan +26125,Novi,Michigan +26125,Oak Park,Michigan +26125,Rochester Hills,Michigan +26125,Southfield,Michigan +26125,Troy,Michigan +26125,W Bloomfield,Michigan +26125,Warren,Michigan +26139,Allendale,Michigan +26139,Holland,Michigan +26143,Roscommon,Michigan +26145,University Center,Michigan +26147,Port Huron,Michigan +26149,Centreville,Michigan +26155,Owosso,Michigan +26161,Ann Arbor,Michigan +26161,Ypsilanti,Michigan +26163,Allen Park,Michigan +26163,Canton,Michigan +26163,Dearborn,Michigan +26163,Detroit,Michigan +26163,Livonia,Michigan +26165,Cadillac,Michigan +27003,Anoka,Minnesota +27003,Blaine,Minnesota +27003,Coon Rapids,Minnesota +27007,Bemidji,Minnesota +27013,Mankato,Minnesota +27015,New Ulm,Minnesota +27017,Cloquet,Minnesota +27019,Saint Bonifacius,Minnesota +27021,Cass Lake,Minnesota +27025,Center City,Minnesota +27027,Moorhead,Minnesota +27035,Brainerd,Minnesota +27037,Burnsville,Minnesota +27037,Eagan,Minnesota +27037,Inver Grove Heights,Minnesota +27037,Lakeville,Minnesota +27037,Mendota Heights,Minnesota +27037,Northfield,Minnesota +27037,Rosemount,Minnesota +27041,Alexandria,Minnesota +27053,Bloomington,Minnesota +27053,Brooklyn Center,Minnesota +27053,Brooklyn Park,Minnesota +27053,Edina,Minnesota +27053,Hopkins,Minnesota +27053,Minneapolis,Minnesota +27053,Plymouth,Minnesota +27053,Richfield,Minnesota +27053,Saint Louis Park,Minnesota +27053,St. Louis Park,Minnesota +27061,Grand Rapids,Minnesota +27067,Willmar,Minnesota +27083,Marshall,Minnesota +27087,Mahnomen,Minnesota +27099,Austin,Minnesota +27103,North Mankato,Minnesota +27103,Saint Peter,Minnesota +27105,Worthington,Minnesota +27109,Rochester,Minnesota +27111,Fergus Falls,Minnesota +27113,Thief River Falls,Minnesota +27115,Pine City,Minnesota +27119,Crookston,Minnesota +27123,New Brighton,Minnesota +27123,Roseville,Minnesota +27123,Saint Paul,Minnesota +27137,Dultuh,Minnesota +27137,Duluth,Minnesota +27137,Ely,Minnesota +27137,Hibbing,Minnesota +27137,Virginia,Minnesota +27139,Shakopee,Minnesota +27141,Elk River,Minnesota +27145,Collegeville,Minnesota +27145,Saint Cloud,Minnesota +27145,Saint Joseph,Minnesota +27145,St. Cloud,Minnesota +27145,Waite Park,Minnesota +27149,Morris,Minnesota +27163,Saint Paul,Minnesota +27163,White Bear Lake,Minnesota +27163,Woodbury,Minnesota +27169,Winona,Minnesota +27173,Granite Falls,Minnesota +28003,Corinth,Mississippi +28011,Cleveland,Mississippi +28021,Alcorn State,Mississippi +28027,Clarksdale,Mississippi +28029,Wesson,Mississippi +28043,Grenada,Mississippi +28047,Biloxi,Mississippi +28047,Gulfport,Mississippi +28049,Clinton,Mississippi +28049,Jackson,Mississippi +28049,Raymond,Mississippi +28057,Fulton,Mississippi +28059,Ocean Springs,Mississippi +28067,Ellisville,Mississippi +28067,Laurel,Mississippi +28067,Ripley,Mississippi +28069,Scooba,Mississippi +28075,Meridian,Mississippi +28083,Itta Bena,Mississippi +28087,Columbus,Mississippi +28089,Tougaloo,Mississippi +28093,Holly Springs,Mississippi +28101,Decatur,Mississippi +28105,Mississippi State,Mississippi +28109,Poplarville,Mississippi +28113,Summit,Mississippi +28115,Pontotoc,Mississippi +28117,Booneville,Mississippi +28121,Flowood,Mississippi +28121,Pearl,Mississippi +28131,Perkinston,Mississippi +28133,Moorhead,Mississippi +28137,Senatobia,Mississippi +28139,Blue Mountain,Mississippi +28151,Greenville,Mississippi +29001,Kirksville,Missouri +29019,Columbia,Missouri +29021,Saint Joseph,Missouri +29021,St Joseph,Missouri +29027,Fulton,Missouri +29031,Cape Girardeau,Missouri +29037,Kansas City,Missouri +29047,Kansas City,Missouri +29047,Liberty,Missouri +29047,North Kansas City,Missouri +29051,Jefferson City,Missouri +29071,Union,Missouri +29077,Springfield,Missouri +29079,Trenton,Missouri +29089,Fayette,Missouri +29091,West Plains,Missouri +29095,Independence,Missouri +29095,Kansas City,Missouri +29095,Lee's Summit,Missouri +29097,Joplin,Missouri +29099,Arnold,Missouri +29099,Hillsboro,Missouri +29101,Warrensburg,Missouri +29107,Lexington,Missouri +29111,Canton,Missouri +29127,Hannibal,Missouri +29145,Neosho,Missouri +29147,Conception,Missouri +29147,Maryville,Missouri +29151,Linn,Missouri +29159,Sedalia,Missouri +29161,Rolla,Missouri +29165,Kansas City,Missouri +29165,Parkville,Missouri +29167,Bolivar,Missouri +29175,Moberly,Missouri +29183,Cottleville,Missouri +29183,Saint Charles,Missouri +29183,Saint Peters,Missouri +29183,St Charles,Missouri +29187,Park Hills,Missouri +29189,Berkeley,Missouri +29189,Brentwood,Missouri +29189,Chesterfield,Missouri +29189,Earth City,Missouri +29189,Fenton,Missouri +29189,Florissant,Missouri +29189,Hazelwood,Missouri +29189,Maryland Heights,Missouri +29189,Saint Louis,Missouri +29189,St. Louis,Missouri +29189,Sunset Hills,Missouri +29189,Webster Groves,Missouri +29195,Marshall,Missouri +29213,Point Lookout,Missouri +29215,Houston,Missouri +29217,Nevada,Missouri +29510,Saint Louis,Missouri +30001,Dillon,Montana +30003,Crow Agency,Montana +30005,Harlem,Montana +30013,Great Falls,Montana +30015,Box Elder,Montana +30017,Miles City,Montana +30021,Glendive,Montana +30029,Kalispell,Montana +30031,Bozeman,Montana +30035,Browning,Montana +30041,Havre,Montana +30047,Pablo,Montana +30049,Helena,Montana +30081,Hamilton,Montana +30085,Poplar,Montana +30087,Lame Deer,Montana +30093,Butte,Montana +30111,Billings,Montana +31001,Hastings,Nebraska +31019,Kearney,Nebraska +31045,Chadron,Nebraska +31053,Fremont,Nebraska +31055,Omaha,Nebraska +31063,Curtis,Nebraska +31079,Grand Island,Nebraska +31109,Lincoln,Nebraska +31111,North Platte,Nebraska +31119,Norfolk,Nebraska +31127,Peru,Nebraska +31151,Crete,Nebraska +31153,Bellevue,Nebraska +31153,Papillion,Nebraska +31157,Gering,Nebraska +31157,Scottsbluff,Nebraska +31159,Seward,Nebraska +31173,Macy,Nebraska +31173,Winnebago,Nebraska +31179,Wayne,Nebraska +31185,York,Nebraska +32003,Henderson,Nevada +32003,Las Vegas,Nevada +32003,North Las Vegas,Nevada +32007,Elko,Nevada +32031,Incline Village,Nevada +32031,Reno,Nevada +32031,Sparks,Nevada +32510,Carson City,Nevada +33001,Laconia,New Hampshire +33005,Keene,New Hampshire +33005,Rindge,New Hampshire +33007,Berlin,New Hampshire +33009,Hanover,New Hampshire +33009,Lebanon,New Hampshire +33009,Plymouth,New Hampshire +33011,Manchester,New Hampshire +33011,Merrimack,New Hampshire +33011,Nashua,New Hampshire +33013,Concord,New Hampshire +33013,Henniker,New Hampshire +33013,Manchester,New Hampshire +33013,New London,New Hampshire +33013,Warner,New Hampshire +33015,Portsmouth,New Hampshire +33017,Durham,New Hampshire +33019,Claremont,New Hampshire +34001,Galloway,New Jersey +34001,Mays Landing,New Jersey +34003,Hackensack,New Jersey +34003,Lodi,New Jersey +34003,Mahwah,New Jersey +34003,Paramus,New Jersey +34003,Ramsey,New Jersey +34003,Teaneck,New Jersey +34003,Teterboro,New Jersey +34005,Mount Laurel,New Jersey +34005,Pemberton,New Jersey +34007,Blackwood,New Jersey +34007,Camden,New Jersey +34007,Cherry Hill,New Jersey +34011,Vineland,New Jersey +34013,Belleville,New Jersey +34013,Bloomfield,New Jersey +34013,Caldwell,New Jersey +34013,Montclair,New Jersey +34013,Newark,New Jersey +34013,South Orange,New Jersey +34015,Glassboro,New Jersey +34015,Sewell,New Jersey +34017,Hoboken,New Jersey +34017,Jersey City,New Jersey +34021,Ewing,New Jersey +34021,Lawrenceville,New Jersey +34021,Princeton,New Jersey +34021,Trenton,New Jersey +34021,West Windsor,New Jersey +34023,Edison,New Jersey +34023,New Brunswick,New Jersey +34023,North Brunswick,New Jersey +34023,Piscataway,New Jersey +34023,South Plainfield,New Jersey +34025,Adelphia,New Jersey +34025,Belmar,New Jersey +34025,Lincroft,New Jersey +34025,Ocean,New Jersey +34025,West Long Branch,New Jersey +34027,Dover,New Jersey +34027,Madison,New Jersey +34027,Mendham,New Jersey +34027,Morristown,New Jersey +34027,Randolph,New Jersey +34029,Lakewood,New Jersey +34029,Toms River,New Jersey +34031,CLIFTON,New Jersey +34031,Paterson,New Jersey +34031,Wayne,New Jersey +34031,Woodland Park,New Jersey +34033,Carneys Point,New Jersey +34035,Branchburg,New Jersey +34037,Newton,New Jersey +34039,Cranford,New Jersey +34039,Elizabeth,New Jersey +34039,Linden,New Jersey +34039,Plainfield,New Jersey +34039,Union,New Jersey +34041,Hackettstown,New Jersey +34041,Washington,New Jersey +35001,Albuquerque,New Mexico +35005,Roswell,New Mexico +35006,Grants,New Mexico +35009,Clovis,New Mexico +35013,Las Cruces,New Mexico +35013,Santa Teresa,New Mexico +35015,Carlsbad,New Mexico +35017,Silver City,New Mexico +35025,Hobbs,New Mexico +35027,Ruidoso,New Mexico +35028,Los Alamos,New Mexico +35031,Gallup,New Mexico +35035,Alamogordo,New Mexico +35037,Tucumcari,New Mexico +35039,Espanola,New Mexico +35041,Portales,New Mexico +35045,Farmington,New Mexico +35047,Las Vegas,New Mexico +35049,Santa Fe,New Mexico +35053,Socorro,New Mexico +35055,Ranchos de Taos,New Mexico +35061,Los Lunas,New Mexico +36001,Albany,New York +36001,Loudonville,New York +36003,Alfred,New York +36003,Houghton,New York +36005,Bronx,New York +36005,Riverdale,New York +36005,Throggs Neck,New York +36007,Binghamton,New York +36007,Johnson City,New York +36007,Vestal,New York +36009,Olean,New York +36009,Saint Bonaventure,New York +36011,Auburn,New York +36013,Fredonia,New York +36013,Jamestown,New York +36015,Elmira,New York +36019,Plattsburgh,New York +36021,Hudson,New York +36023,Aurora,New York +36025,Delhi,New York +36027,Annandale-On-Hudson,New York +36027,Barrytown,New York +36027,Hyde Park,New York +36027,Poughkeepsie,New York +36029,Amherst,New York +36029,Buffalo,New York +36029,East Aurora,New York +36029,Getzville,New York +36029,Hamburg,New York +36029,Orchard Park,New York +36031,Saranac Lake,New York +36033,Paul Smiths,New York +36037,Batavia,New York +36043,Herkimer,New York +36045,Watertown,New York +36047,Brooklyn,New York +36047,Brooklyn Heights,New York +36051,Geneseo,New York +36053,Cazenovia,New York +36053,Hamilton,New York +36055,Brockport,New York +36055,Rochester,New York +36057,Johnstown,New York +36059,Bethpage,New York +36059,Brookville,New York +36059,Cold Spring Harbor,New York +36059,Garden City,New York +36059,Glen Cove,New York +36059,Hempstead,New York +36059,Kings Point,New York +36059,Lawrence,New York +36059,Levittown,New York +36059,Long Beach,New York +36059,Mineola,New York +36059,Old Westbury,New York +36059,Rockville Centre,New York +36059,Syosset,New York +36059,Valley Stream,New York +36061,New York,New York +36061,New York,New York +36061,Plainfield,New Jersey +36061,Staunton,Virginia +36063,Niagara University,New York +36063,Sanborn,New York +36065,Clinton,New York +36065,Utica,New York +36067,Liverpool,New York +36067,Syracuse,New York +36069,Canandaigua,New York +36069,Geneva,New York +36071,Middletown,New York +36071,Monroe,New York +36071,Newburgh,New York +36071,West Point,New York +36075,Oswego,New York +36077,Oneonta,New York +36081,Bayside,New York +36081,Far Rockaway,New York +36081,Flushing,New York +36081,Forest Hills,New York +36081,Jackson Heights,New York +36081,Jamaica,New York +36081,Kew Gardens,New York +36081,Long Island City,New York +36081,Queens,New York +36081,Rego Park,New York +36083,Albany,New York +36083,Troy,New York +36085,Staten Island,New York +36087,Monsey,New York +36087,Nyack,New York +36087,Orangeburg,New York +36087,Sparkill,New York +36087,Spring Valley,New York +36087,Suffern,New York +36089,Canton,New York +36089,Potsdam,New York +36091,Saratoga Springs,New York +36093,Schenectady,New York +36095,Cobleskill,New York +36099,Seneca Falls,New York +36101,Corning,New York +36101,Hornell,New York +36103,Amityville,New York +36103,Dix Hills,New York +36103,Farmingdale,New York +36103,Melville,New York +36103,Northport,New York +36103,Oakdale,New York +36103,Riverhead,New York +36103,Selden,New York +36103,Stony Brook,New York +36105,Loch Sheldrake,New York +36105,South Fallsburgh,New York +36109,Dryden,New York +36109,Ithaca,New York +36111,New Paltz,New York +36111,Stone Ridge,New York +36113,Pottersville,New York +36113,Queensbury,New York +36119,Bronxville,New York +36119,Crestwood,New York +36119,Dobbs Ferry,New York +36119,Mount Kisco,New York +36119,Mount Vernon,New York +36119,New Rochelle,New York +36119,Ossining,New York +36119,Peekskill,New York +36119,Purchase,New York +36119,Valhalla,New York +36119,White Plains,New York +36119,Yonkers,New York +36123,Keuka Park,New York +37001,Elon,North Carolina +37001,Graham,North Carolina +37007,Polkton,North Carolina +37011,Banner Elk,North Carolina +37011,Spruce Pine,North Carolina +37013,Washington,North Carolina +37017,Dublin,North Carolina +37019,Bolivia,North Carolina +37021,Asheville,North Carolina +37021,Montreat,North Carolina +37021,Swannanoa,North Carolina +37023,Morganton,North Carolina +37025,Concord,North Carolina +37027,Hudson,North Carolina +37031,Morehead City,North Carolina +37035,Hickory,North Carolina +37039,Murphy,North Carolina +37045,Boiling Springs,North Carolina +37045,Shelby,North Carolina +37049,New Bern,North Carolina +37051,Fayetteville,North Carolina +37057,Thomasville,North Carolina +37061,Kenansville,North Carolina +37063,Durham,North Carolina +37065,Tarboro,North Carolina +37067,Winston Salem,North Carolina +37067,Winston-Salem,North Carolina +37069,Louisburg,North Carolina +37071,Belmont,North Carolina +37071,Dallas,North Carolina +37081,Greensboro,North Carolina +37081,High Point,North Carolina +37081,Jamestown,North Carolina +37083,Weldon,North Carolina +37085,Buies Creek,North Carolina +37085,Dunn,North Carolina +37087,Clyde,North Carolina +37089,Flat Rock,North Carolina +37091,Ahoskie,North Carolina +37091,Murfreesboro,North Carolina +37097,Mooresville,North Carolina +37097,Statesville,North Carolina +37099,Cullowhee,North Carolina +37101,Smithfield,North Carolina +37105,Sanford,North Carolina +37107,Kinston,North Carolina +37111,Marion,North Carolina +37115,Mars Hill,North Carolina +37117,Williamston,North Carolina +37119,Charlotte,North Carolina +37119,Davidson,North Carolina +37123,Troy,North Carolina +37125,Pinehurst,North Carolina +37127,Rocky Mount,North Carolina +37129,Wilmington,North Carolina +37133,Jacksonville,North Carolina +37135,Chapel Hill,North Carolina +37137,Grantsboro,North Carolina +37139,Elizabeth City,North Carolina +37145,Roxboro,North Carolina +37147,Greenville,North Carolina +37147,Winterville,North Carolina +37151,Asheboro,North Carolina +37153,Hamlet,North Carolina +37155,Lumberton,North Carolina +37155,Pembroke,North Carolina +37157,Wentworth,North Carolina +37159,Salisbury,North Carolina +37161,Spindale,North Carolina +37163,Clinton,North Carolina +37165,Laurinburg,North Carolina +37167,Albemarle,North Carolina +37167,Misenheimer,North Carolina +37171,Dobson,North Carolina +37175,Brevard,North Carolina +37179,Wingate,North Carolina +37181,Henderson,North Carolina +37183,Cary,North Carolina +37183,Morrisville,North Carolina +37183,Raleigh,North Carolina +37189,Boone,North Carolina +37189,Sugar Grove,North Carolina +37191,Goldsboro,North Carolina +37191,Mount Olive,North Carolina +37193,Wilkesboro,North Carolina +37195,Wilson,North Carolina +38003,Valley City,North Dakota +38005,Fort Totten,North Dakota +38009,Bottineau,North Dakota +38015,Bismarck,North Dakota +38017,Fargo,North Dakota +38021,Ellendale,North Dakota +38035,Grand Forks,North Dakota +38061,New Town,North Dakota +38071,Devils Lake,North Dakota +38077,Wahpeton,North Dakota +38085,Fort Yates,North Dakota +38089,Dickinson,North Dakota +38093,Jamestown,North Dakota +38097,Mayville,North Dakota +38101,Minot,North Dakota +38105,Williston,North Dakota +39003,Bluffton,Ohio +39003,Lima,Ohio +39005,Ashland,Ohio +39009,Athens,Ohio +39009,Nelsonville,Ohio +39013,Saint Clairsville,Ohio +39015,Saint Martin,Ohio +39017,Hamilton,Ohio +39017,Middletown,Ohio +39017,Oxford,Ohio +39017,West Chester,Ohio +39021,Urbana,Ohio +39023,Springfield,Ohio +39025,Batavia,Ohio +39027,Wilmington,Ohio +39029,East Liverpool,Ohio +39029,Salem,Ohio +39035,Beachwood,Ohio +39035,Berea,Ohio +39035,Brecksville,Ohio +39035,Broadview Heights,Ohio +39035,Brooklyn,Ohio +39035,Cleveland,Ohio +39035,Euclid,Ohio +39035,Fairview Park,Ohio +39035,Highland Heights,Ohio +39035,Independence,Ohio +39035,Lakewood,Ohio +39035,Middleburg Heights,Ohio +39035,North Olmsted,Ohio +39035,North Randall,Ohio +39035,Parma,Ohio +39035,Pepper Pike,Ohio +39035,Rocky River,Ohio +39035,Strongsville,Ohio +39035,Warrensville Heights,Ohio +39039,Defiance,Ohio +39041,Delaware,Ohio +39043,Huron,Ohio +39043,Sandusky,Ohio +39045,Lancaster,Ohio +39049,CANAL WINCHESTER,Ohio +39049,Columbu,Ohio +39049,Columbus,Ohio +39049,Grove City,Ohio +39049,Jackson,Ohio +39049,Westerville,Ohio +39053,Rio Grande,Ohio +39055,Burton,Ohio +39057,Cedarville,Ohio +39057,Wilberforce,Ohio +39057,Wright-Patterson AFB,Ohio +39057,Yellow Springs,Ohio +39061,Blue Ash,Ohio +39061,Cincinnati,Ohio +39061,Springdale,Ohio +39061,Summerdale,Pennsylvania +39063,Findlay,Ohio +39065,Ada,Ohio +39069,Archbold,Ohio +39071,Hillsboro,Ohio +39077,Norwalk,Ohio +39081,Steubenville,Ohio +39083,Gambier,Ohio +39083,Mount Vernon,Ohio +39085,Eastlake,Ohio +39085,Kirtland,Ohio +39085,Mentor,Ohio +39085,Painesville,Ohio +39085,Wickliffe,Ohio +39085,Willoughby Hills,Ohio +39087,Chesapeake,Ohio +39087,Ironton,Ohio +39087,South Point,Ohio +39089,Granville,Ohio +39089,Newark,Ohio +39093,Elyria,Ohio +39093,Oberlin,Ohio +39093,Sheffield Village,Ohio +39095,Maumee,Ohio +39095,OREGON,Ohio +39095,Sylvania,Ohio +39095,Toledo,Ohio +39097,Irwin,Ohio +39099,Boardman,Ohio +39099,Youngstown,Ohio +39101,Marion,Ohio +39103,Brunswick,Ohio +39107,Celina,Ohio +39109,Troy,Ohio +39113,Centerville,Ohio +39113,Dayton,Ohio +39113,Huber Heights,Ohio +39113,Kettering,Ohio +39113,Miamisburg,Ohio +39119,New Concord,Ohio +39119,Zanesville,Ohio +39129,Circleville,Ohio +39133,"2nd Floor Library""",Kent +39133,Ravenna,Ohio +39133,Rootstown,Ohio +39139,Mansfield,Ohio +39141,Chillicothe,Ohio +39143,Fremont,Ohio +39145,New Boston,Ohio +39145,Portsmouth,Ohio +39147,Tiffin,Ohio +39151,Alliance,Ohio +39151,Canton,Ohio +39151,North Canton,Ohio +39153,Akron,Ohio +39153,Copley,Ohio +39153,Cuyahoga Falls,Ohio +39153,Stow,Ohio +39155,Niles,Ohio +39155,Warren,Ohio +39165,Franklin,Ohio +39165,Lebanon,Ohio +39165,Mason,Ohio +39165,Springboro,Ohio +39167,Marietta,Ohio +39169,Orrville,Ohio +39169,Wooster,Ohio +39173,Bowling Green,Ohio +39173,Perrysburg,Ohio +40013,Durant,Oklahoma +40015,Fort Cobb,Oklahoma +40017,El Reno,Oklahoma +40021,Tahlequah,Oklahoma +40027,Moore,Oklahoma +40027,Norman,Oklahoma +40027,Oklahoma City,Oklahoma +40031,Lawton,Oklahoma +40039,Weatherford,Oklahoma +40047,Enid,Oklahoma +40051,Chickasha,Oklahoma +40061,Stigler,Oklahoma +40065,Altus,Oklahoma +40069,Tishomingo,Oklahoma +40071,Tonkawa,Oklahoma +40077,Wilburton,Oklahoma +40079,Poteau,Oklahoma +40083,Langston,Oklahoma +40101,Muskogee,Oklahoma +40101,Warner,Oklahoma +40109,Bethany,Oklahoma +40109,Edmond,Oklahoma +40109,Midwest City,Oklahoma +40109,Oklahoma City,Oklahoma +40109,Warr Acres,Oklahoma +40111,Okmulgee,Oklahoma +40115,Miami,Oklahoma +40119,Stillwater,Oklahoma +40123,Ada,Oklahoma +40125,Shawnee,Oklahoma +40131,Claremore,Oklahoma +40133,Seminole,Oklahoma +40139,Goodwell,Oklahoma +40143,Tulsa,Oklahoma +40147,Bartlesville,Oklahoma +40151,Alva,Oklahoma +41003,Corvallis,Oregon +41005,Clackamas,Oregon +41005,Happy Valley,Oregon +41005,Marylhurst,Oregon +41005,Oregon City,Oregon +41005,Wilsonville,Oregon +41007,Astoria,Oregon +41011,Coos Bay,Oregon +41017,Bend,Oregon +41019,Roseburg,Oregon +41029,Ashland,Oregon +41029,Medford,Oregon +41033,Grants Pass,Oregon +41035,Klamath Falls,Oregon +41039,Eugene,Oregon +41039,Springfield,Oregon +41039,Superior,Wisconsin +41041,Newport,Oregon +41043,Albany,Oregon +41045,Ontario,Oregon +41047,Saint Benedict,Oregon +41047,Salem,Oregon +41051,Gresham,Oregon +41051,Portland,Oregon +41053,Monmouth,Oregon +41057,Tillamook,Oregon +41059,Pendleton,Oregon +41061,La Grande,Oregon +41065,The Dalles,Oregon +41067,Beaverton,Oregon +41067,Forest Grove,Oregon +41067,Tigard,Oregon +41067,Tualatin,Oregon +41071,McMinnville,Oregon +41071,Newberg,Oregon +42001,Gettysburg,Pennsylvania +42003,McKeesport,Pennsylvania +42003,Monroeville,Pennsylvania +42003,Moon Township,Pennsylvania +42003,Oakdale,Pennsylvania +42003,Pittsburgh,Pennsylvania +42003,Tarentum,Pennsylvania +42003,West Mifflin,Pennsylvania +42007,Ambridge,Pennsylvania +42007,Beaver Falls,Pennsylvania +42007,Monaca,Pennsylvania +42011,Kutztown,Pennsylvania +42011,Reading,Pennsylvania +42011,Wyomissing,Pennsylvania +42013,Altoona,Pennsylvania +42017,Bristol,Pennsylvania +42017,Doylestown,Pennsylvania +42017,Feasterville,Pennsylvania +42017,Langhorne,Pennsylvania +42017,Levittown,Pennsylvania +42017,Newtown,Pennsylvania +42017,Trevose,Pennsylvania +42017,Warminster,Pennsylvania +42019,Butler,Pennsylvania +42019,Slippery Rock,Pennsylvania +42021,Cresson,Pennsylvania +42021,Johnstown,Pennsylvania +42021,Loretto,Pennsylvania +42027,State College,Pennsylvania +42027,University Park,Pennsylvania +42029,Cheyney,Pennsylvania +42029,Exton,Pennsylvania +42029,Immaculata,Pennsylvania +42029,Lincoln University,Pennsylvania +42029,Malvern,Pennsylvania +42029,Phoenixville,Pennsylvania +42029,West Chester,Pennsylvania +42031,Clarion,Pennsylvania +42033,DuBois,Pennsylvania +42035,Lock Haven,Pennsylvania +42037,Bloomsburg,Pennsylvania +42039,Meadville,Pennsylvania +42039,Titusville,Pennsylvania +42041,Carlisle,Pennsylvania +42041,Mechanicsburg,Pennsylvania +42041,Shippensburg,Pennsylvania +42043,Harrisburg,Pennsylvania +42043,Hershey,Pennsylvania +42043,Middletown,Pennsylvania +42045,Aston,Pennsylvania +42045,Broomall,Pennsylvania +42045,Bryn Mawr,Pennsylvania +42045,Chester,Pennsylvania +42045,Essington,Pennsylvania +42045,Media,Pennsylvania +42045,Radnor,Pennsylvania +42045,Saint Davids,Pennsylvania +42045,Swarthmore,Pennsylvania +42045,Upper Darby,Pennsylvania +42045,Villanova,Pennsylvania +42045,Wayne,Pennsylvania +42049,Edinboro,Pennsylvania +42049,Erie,Pennsylvania +42049,North East,Pennsylvania +42051,Lemont Furnace,Pennsylvania +42051,Mount Braddock,Pennsylvania +42051,Uniontown,Pennsylvania +42055,Chambersburg,Pennsylvania +42055,Mont Alto,Pennsylvania +42059,Waynesburg,Pennsylvania +42061,Huntingdon,Pennsylvania +42063,Blairsville,Pennsylvania +42063,Indiana,Pennsylvania +42069,Clarks Summit,Pennsylvania +42069,Dunmore,Pennsylvania +42069,Scranton,Pennsylvania +42071,Elizabethtown,Pennsylvania +42071,Lancaster,Pennsylvania +42073,New Castle,Pennsylvania +42075,Annville,Pennsylvania +42075,Myerstown,Pennsylvania +42077,Allentown,Pennsylvania +42077,Center Valley,Pennsylvania +42077,Schnecksville,Pennsylvania +42079,Dallas,Pennsylvania +42079,Forty Fort,Pennsylvania +42079,Hazleton,Pennsylvania +42079,Lehman,Pennsylvania +42079,Nanticoke,Pennsylvania +42079,Wilkes-Barre,Pennsylvania +42081,Williamsport,Pennsylvania +42083,Bradford,Pennsylvania +42085,Greenville,Pennsylvania +42085,Grove City,Pennsylvania +42085,Sharon,Pennsylvania +42087,Lewistown,Pennsylvania +42089,East Stroudsburg,Pennsylvania +42091,Abington,Pennsylvania +42091,Blue Bell,Pennsylvania +42091,Bryn Athyn,Pennsylvania +42091,Bryn Mawr,Pennsylvania +42091,Collegeville,Pennsylvania +42091,Elkins Park,Pennsylvania +42091,Erdenheim,Pennsylvania +42091,Fort Washington,Pennsylvania +42091,Glenside,Pennsylvania +42091,Gwynedd Valley,Pennsylvania +42091,Hatfield,Pennsylvania +42091,Haverford,Pennsylvania +42091,Jenkintown,Pennsylvania +42091,Lansdale,Pennsylvania +42091,Melrose Park,Pennsylvania +42091,North Wales,Pennsylvania +42091,Rosemont,Pennsylvania +42091,Willow Grove,Pennsylvania +42091,Wyncote,Pennsylvania +42091,Wynnewood,Pennsylvania +42095,Bethlehem,Pennsylvania +42095,Easton,Pennsylvania +42097,Sunbury,Pennsylvania +42101,Philadelphia,Pennsylvania +42107,Pottsville,Pennsylvania +42107,Schuylkill Haven,Pennsylvania +42109,Selinsgrove,Pennsylvania +42111,Somerset,Pennsylvania +42117,Mansfield,Pennsylvania +42119,Lewisburg,Pennsylvania +42121,Oil City,Pennsylvania +42125,California,Pennsylvania +42125,Washington,Pennsylvania +42129,Greensburg,Pennsylvania +42129,Latrobe,Pennsylvania +42129,Lower Burrell,Pennsylvania +42129,Monessen,Pennsylvania +42129,New Kensington,Pennsylvania +42129,Youngwood,Pennsylvania +42131,La Plume,Pennsylvania +42133,York,Pennsylvania +44001,Bristol,Rhode Island +44003,East Greenwich,Rhode Island +44003,Warwick,Rhode Island +44005,Newport,Rhode Island +44007,Cranston,Rhode Island +44007,Lincoln,Rhode Island +44007,Providence,Rhode Island +44007,Smithfield,Rhode Island +45001,Due West,South Carolina +45003,Aiken,South Carolina +45003,Graniteville,South Carolina +45005,Allendale,South Carolina +45007,Anderson,South Carolina +45007,Greenville,South Carolina +45007,Pendleton,South Carolina +45009,Denmark,South Carolina +45013,Beaufort,South Carolina +45013,Bluffton,South Carolina +45019,Charleston,South Carolina +45019,North Charleston,South Carolina +45021,Gaffney,South Carolina +45025,Cheraw,South Carolina +45031,Hartsville,South Carolina +45041,Florence,South Carolina +45045,Greenville,South Carolina +45045,Tigerville,South Carolina +45047,Greenwood,South Carolina +45051,Conway,South Carolina +45051,Myrtle Beach,South Carolina +45057,Lancaster,South Carolina +45059,Clinton,South Carolina +45063,West Columbia,South Carolina +45071,Newberry,South Carolina +45075,Orangeburg,South Carolina +45077,Central,South Carolina +45077,Clemson,South Carolina +45079,Columbia,South Carolina +45083,Spartanburg,South Carolina +45085,Sumter,South Carolina +45087,Union,South Carolina +45089,Kingstree,South Carolina +45091,Rock Hill,South Carolina +46011,Brookings,South Dakota +46013,Aberdeen,South Dakota +46027,Vermillion,South Dakota +46029,Watertown,South Dakota +46035,Mitchell,South Dakota +46079,Madison,South Dakota +46081,Spearfish,South Dakota +46083,Sioux Falls,South Dakota +46099,Sioux Falls,South Dakota +46103,Rapid City,South Dakota +46109,Sisseton,South Dakota +46113,Kyle,South Dakota +46135,Yankton,South Dakota +47003,Shelbyville,Tennessee +47009,Maryville,Tennessee +47011,Cleveland,Tennessee +47013,Jacksboro,Tennessee +47017,McKenzie,Tennessee +47019,Elizabethton,Tennessee +47019,Milligan College,Tennessee +47023,Henderson,Tennessee +47025,Harrogate,Tennessee +47035,Crossville,Tennessee +47037,Madison,Tennessee +47037,Nashville,Tennessee +47043,Dickson,Tennessee +47045,Dyersburg,Tennessee +47045,Newbern,Tennessee +47051,Sewanee,Tennessee +47055,Pulaski,Tennessee +47059,Greeneville,Tennessee +47063,Morristown,Tennessee +47065,Chattanooga,Tennessee +47065,Collegedale,Tennessee +47069,Whiteville,Tennessee +47071,Crump,Tennessee +47079,Paris,Tennessee +47089,Jefferson City,Tennessee +47093,Knoxville,Tennessee +47097,Ripley,Tennessee +47101,Hohenwald,Tennessee +47107,Athens,Tennessee +47113,Jackson,Tennessee +47119,Columbia,Tennessee +47123,Madisonville,Tennessee +47125,Clarksville,Tennessee +47127,Tullahoma,Tennessee +47133,Livingston,Tennessee +47141,Cookeville,Tennessee +47143,Dayton,Tennessee +47145,Harriman,Tennessee +47149,Murfreesboro,Tennessee +47151,Huntsville,Tennessee +47157,Cordova,Tennessee +47157,Memphis,Tennessee +47163,Blountville,Tennessee +47163,Bristol,Tennessee +47165,Gallatin,Tennessee +47167,Covington,Tennessee +47169,Hartsville,Tennessee +47177,McMinnville,Tennessee +47179,Johnson City,Tennessee +47183,Martin,Tennessee +47187,Franklin,Tennessee +47189,Lebanon,Tennessee +48005,Lufkin,Texas +48025,Beeville,Texas +48027,Belton,Texas +48027,Temple,Texas +48029,San Antonio,Texas +48029,Santurce,Puerto Rico +48037,Texarkana,Texas +48039,Alvin,Texas +48039,Lake Jackson,Texas +48041,College Station,Texas +48043,Alpine,Texas +48049,Brownwood,Texas +48061,Brownsville,Texas +48061,Harlingen,Texas +48073,Jacksonville,Texas +48085,McKinney,Texas +48097,Gainesville,Texas +48099,Killeen,Texas +48113,Cedar Hill,Texas +48113,Dallas,Texas +48113,DeSoto,Texas +48113,Farmers Branch,Texas +48113,Garland,Texas +48113,Irving,Texas +48113,Lancaster,Texas +48113,Mesquite,Texas +48113,Richardson,Texas +48121,Denton,Texas +48129,Clarendon,Texas +48133,Cisco,Texas +48133,Ranger,Texas +48135,Odessa,Texas +48139,Waxahachie,Texas +48141,El Paso,Texas +48143,Stephenville,Texas +48167,Galveston,Texas +48167,Texas City,Texas +48181,Denison,Texas +48181,Sherman,Texas +48183,Kilgore,Texas +48183,Longview,Texas +48187,Seguin,Texas +48189,Plainview,Texas +48201,Baytown,Texas +48201,Friendswood,Texas +48201,Houston,Texas +48201,Pasadena,Texas +48201,Webster,Texas +48203,Marshall,Texas +48209,San Marcos,Texas +48213,Athens,Texas +48215,Edinburg,Texas +48215,McAllen,Texas +48215,Mission,Texas +48217,Hillsboro,Texas +48219,Levelland,Texas +48227,Big Spring,Texas +48231,Commerce,Texas +48233,Borger,Texas +48245,Beaumont,Texas +48245,Port Arthur,Texas +48251,Keene,Texas +48257,Terrell,Texas +48265,Kerrville,Texas +48273,Kingsville,Texas +48277,Paris,Texas +48303,Lubbock,Texas +48309,Waco,Texas +48329,Midland,Texas +48339,The Woodlands,Texas +48349,Corsicana,Texas +48353,Sweetwater,Texas +48355,Corpus Christi,Texas +48361,Orange,Texas +48365,Carthage,Texas +48367,Weatherford,Texas +48375,Amarillo,Texas +48381,Canyon,Texas +48415,Snyder,Texas +48423,Tyler,Texas +48439,Arlington,Texas +48439,Euless,Texas +48439,Fort Worth,Texas +48439,Ft Worth,Texas +48439,Grand Prairie,Texas +48441,Abilene,Texas +48449,Mount Pleasant,Texas +48451,San Angelo,Texas +48453,Austin,Texas +48463,Uvalde,Texas +48469,Victoria,Texas +48471,Huntsville,Texas +48473,Prairie View,Texas +48477,Brenham,Texas +48479,Laredo,Texas +48481,Wharton,Texas +48485,Wichita Falls,Texas +48487,Vernon,Texas +48491,Georgetown,Texas +49005,Logan,Utah +49011,Kaysville,Utah +49011,Layton,Utah +49021,Cedar City,Utah +49035,Draper,Utah +49035,Holiday,Utah +49035,Midvale,Utah +49035,Murray,Utah +49035,Salt Lake City,Utah +49035,Sandy,Utah +49035,West Jordan,Utah +49035,West Valley City,Utah +49039,Ephraim,Utah +49045,Tooele,Utah +49049,American Fork,Utah +49049,Lehi,Utah +49049,Orem,Utah +49049,Payson,Utah +49049,Provo,Utah +49053,Saint George,Utah +49053,St. George,Utah +49057,Ogden,Utah +49057,West Haven,Utah +50001,Middlebury,Vermont +50003,Bennington,Vermont +50005,Lyndonville,Vermont +50007,Burlington,Vermont +50007,Colchester,Vermont +50007,Winooski,Vermont +50015,Johnson,Vermont +50017,Randolph Center,Vermont +50021,Castleton,Vermont +50021,Poultney,Vermont +50021,Rutland,Vermont +50023,Montpelier,Vermont +50023,Northfield,Vermont +50023,Plainfield,Vermont +50025,Brattleboro,Vermont +50025,Marlboro,Vermont +50025,Putney,Vermont +50027,South Royalton,Vermont +51001,Melfa,Virginia +51003,Charlottesville,Virginia +51005,Clifton Forge,Virginia +51009,Sweet Briar,Virginia +51013,Arlington,Virginia +51025,Alberta,Virginia +51025,Lawrenceville,Virginia +51027,Grundy,Virginia +51027,Oakwood,Virginia +51041,Chester,Virginia +51041,North Chesterfield,Virginia +51059,Annandale,Virginia +51059,Fairfax,Virginia +51059,Falls Church,Virginia +51059,McLean,Virginia +51059,Reston,Virginia +51059,Springfield,Virginia +51059,Vienna,Virginia +51067,Ferrum,Virginia +51069,Middletown,Virginia +51073,Glenns,Virginia +51085,Ashland,Virginia +51087,Glen Allen,Virginia +51087,Henrico,Virginia +51087,Richmond,Virginia +51089,Martinsville,Virginia +51121,Blacksburg,Virginia +51137,Locust Grove,Virginia +51147,Farmville,Virginia +51147,Hampden-Sydney,Virginia +51153,Manassas,Virginia +51155,Dublin,Virginia +51165,Bridgewater,Virginia +51185,Bluefield,Virginia +51191,Abingdon,Virginia +51191,Emory,Virginia +51195,Big Stone Gap,Virginia +51195,Wise,Virginia +51197,Wytheville,Virginia +51510,Alexandria,Virginia +51520,Bristol,Virginia +51530,Buena Vista,Virginia +51550,Chesapeake,Virginia +51590,Danville,Virginia +51620,Franklin,Virginia +51630,Fredericksburg,Virginia +51650,Hampton,Virginia +51660,Harrisonburg,Virginia +51678,Lexington,Virginia +51680,Lynchburg,Virginia +51700,Newport News,Virginia +51710,Norfolk,Virginia +51730,Petersburg,Virginia +51750,Radford,Virginia +51760,University of Richmond,Virginia +51770,Roanoke,Virginia +51775,Salem,Virginia +51810,Virginia Beach,Virginia +51830,Williamsburg,Virginia +51840,Winchester,Virginia +53005,Richland,Washington +53007,Wenatchee,Washington +53009,Port Angeles,Washington +53011,Vancouver,Washington +53015,Longview,Washington +53021,Pasco,Washington +53025,Moses Lake,Washington +53027,Aberdeen,Washington +53029,Langley,Washington +53031,Port Hadlock,Washington +53033,Auburn,Washington +53033,Bellevue,Washington +53033,Bothell,Washington +53033,Des Moines,Washington +53033,Federal Way,Washington +53033,Kenmore,Washington +53033,Kirkland,Washington +53033,Redmond,Washington +53033,Renton,Washington +53033,Seattle,Washington +53033,Shoreline,Washington +53033,Tukwila,Washington +53035,Bremerton,Washington +53035,Poulsbo,Washington +53037,Ellensburg,Washington +53041,Centralia,Washington +53053,Lakewood,Washington +53053,Puyallup,Washington +53053,Tacoma,Washington +53057,Mount Vernon,Washington +53061,Everett,Washington +53061,Lynnwood,Washington +53063,Cheney,Washington +53063,Spokane,Washington +53063,Spokane Valley,Washington +53067,Lacey,Washington +53067,Olympia,Washington +53071,College Place,Washington +53071,Walla Walla,Washington +53073,Bellingham,Washington +53075,Pullman,Washington +53077,Toppenish,Washington +53077,Yakima,Washington +54001,Philippi,West Virginia +54003,Martinsburg,West Virginia +54011,Huntington,West Virginia +54019,Montgomery,West Virginia +54021,Glenville,West Virginia +54023,Petersburg,West Virginia +54025,Lewisburg,West Virginia +54031,Moorefield,West Virginia +54033,Bridgeport,West Virginia +54033,Clarksburg,West Virginia +54033,Salem,West Virginia +54037,Charles Town,West Virginia +54037,Shepherdstown,West Virginia +54039,Charleston,West Virginia +54039,Institute,West Virginia +54039,South Charleston,West Virginia +54045,Mount Gay,West Virginia +54049,Fairmont,West Virginia +54055,Athens,West Virginia +54055,Bluefield,West Virginia +54055,Princeton,West Virginia +54057,Keyser,West Virginia +54061,Morgantown,West Virginia +54069,West Liberty,West Virginia +54069,Wheeling,West Virginia +54079,Scott Depot,West Virginia +54081,Beckley,West Virginia +54081,Mount Hope,West Virginia +54083,Elkins,West Virginia +54097,Buckhannon,West Virginia +54107,Parkersburg,West Virginia +54107,Waverly,West Virginia +55003,Ashland,Wisconsin +55009,De Pere,Wisconsin +55009,Green Bay,Wisconsin +55025,Madison,Wisconsin +55025,Middleton,Wisconsin +55027,Waupun,Wisconsin +55033,Menomonie,Wisconsin +55035,Eau Claire,Wisconsin +55039,Fond du Lac,Wisconsin +55039,Ripon,Wisconsin +55043,Fennimore,Wisconsin +55043,Platteville,Wisconsin +55055,Watertown,Wisconsin +55059,Kenosha,Wisconsin +55063,La Crosse,Wisconsin +55063,Onalaska,Wisconsin +55071,Cleveland,Wisconsin +55071,Manitowoc,Wisconsin +55073,Rothschild,Wisconsin +55073,Wausau,Wisconsin +55075,Dunbar,Wisconsin +55075,Peshtigo,Wisconsin +55079,Franklin,Wisconsin +55079,Glendale,Wisconsin +55079,Greenfield,Wisconsin +55079,Milwaukee,Wisconsin +55079,Wauwatosa,Wisconsin +55085,Rhinelander,Wisconsin +55087,Appleton,Wisconsin +55087,Grand Chute,Wisconsin +55089,Mequon,Wisconsin +55093,River Falls,Wisconsin +55097,Stevens Point,Wisconsin +55101,Racine,Wisconsin +55105,Beloit,Wisconsin +55105,Janesville,Wisconsin +55111,Baraboo,Wisconsin +55113,Hayward,Wisconsin +55115,Keshena,Wisconsin +55127,Whitewater,Wisconsin +55129,Shell Lake,Wisconsin +55133,Brookfield,Wisconsin +55133,Nashotah,Wisconsin +55133,Pewaukee,Wisconsin +55133,Waukesha,Wisconsin +55139,Oshkosh,Wisconsin +55141,Wisconsin Rapids,Wisconsin +56001,Laramie,Wyoming +56013,Riverton,Wyoming +56015,Torrington,Wyoming +56021,Cheyenne,Wyoming +56025,Casper,Wyoming +56029,Powell,Wyoming +56033,Sheridan,Wyoming +56037,Rock Springs,Wyoming +60010,Pago Pago,American Samoa +66010,Mangilao,Guam +69110,Saipan,Northern Marianas +72005,Aguadilla,Puerto Rico +72005,Ramey,Puerto Rico +72013,Arecibo,Puerto Rico +72019,Barranquitas,Puerto Rico +72021,BayamÃŒ_n,Puerto Rico +72021,Bayamon,Puerto Rico +72025,BayamÃŒ_n,Puerto Rico +72025,Caguas,Puerto Rico +72031,Carolina,Puerto Rico +72035,Cayey,Puerto Rico +72053,Fajardo,Puerto Rico +72057,Guayama,Puerto Rico +72061,Guaynabo,Puerto Rico +72069,Humacao,Puerto Rico +72091,Manati,Puerto Rico +72097,Mayaguez,Puerto Rico +72113,Mercedita,Puerto Rico +72113,Ponce,Puerto Rico +72125,San German,Puerto Rico +72127,Cupey,Puerto Rico +72127,Hato Rey,Puerto Rico +72127,Rio Piedras,Puerto Rico +72127,San Juan,Puerto Rico +72153,Yauco,Puerto Rico +78030,Charlotte Amalie,Virgin Islands +1003,Bay Minette,Alabama \ No newline at end of file diff --git a/db/migrate/20200525234832_move_user_info_from_questionnaire_to_user_model.rb b/db/migrate/20200525234832_move_user_info_from_questionnaire_to_user_model.rb new file mode 100644 index 000000000..7079ad37b --- /dev/null +++ b/db/migrate/20200525234832_move_user_info_from_questionnaire_to_user_model.rb @@ -0,0 +1,61 @@ +class MoveUserInfoFromQuestionnaireToUserModel < ActiveRecord::Migration[5.2] + + # See the "Hackathon Manager 2.0 Migration Guide" + # for a more general description of what this migration does. + + # Effectively, we move the `first_name` and `last_name` columns + # from the questionnares table to the users table (and model, for both). + + def up + + # Add the first/last name columns to the users table + add_column :users, :first_name, :string + add_column :users, :last_name, :string + + # Copy the data + execute "UPDATE users u, questionnaires q SET u.first_name = q.first_name WHERE u.id = q.user_id" + execute "UPDATE users u, questionnaires q SET u.last_name = q.last_name WHERE u.id = q.user_id" + + # If either first or last name is null, + # use the first part of their email as their first and last name. + # It is not currently possible to set only one and not the other, + # but we are "handling" that case nevertheless. + # + # This is needed because first and last names are REQUIRED to be non-nil. + User.where("first_name IS NULL AND last_name IS NULL").each do |u| + email_head = u.email.partition('@').first + u.first_name = email_head + u.last_name = email_head + u.save() + end + + # Remove the first/last name columns from the questionnaires table + remove_column :questionnaires, :first_name, :string + remove_column :questionnaires, :last_name, :string + end + + def down + + # Add the first/last name columns back to the questionnaires table + add_column :questionnaires, :first_name, :string + add_column :questionnaires, :last_name, :string + + # Copy the data + execute "UPDATE questionnaires q, users u SET q.first_name = u.first_name WHERE q.user_id = u.id" + execute "UPDATE questionnaires q, users u SET q.last_name = u.last_name WHERE q.user_id = u.id" + + # For all users, undo the email assignment scheme we did before, + # and set both their first/last name to nil. + User.all.each do |u| + email_head = u.email.partition('@').first + if u.first_name == email_head and u.last_name == email_head + u.first_name = nil + u.last_name = nil + end + end + + # Finally, remove the first/last name columns from the users table. + remove_column :users, :first_name, :string + remove_column :users, :last_name, :string + end +end diff --git a/db/migrate/20200530172450_delete_disable_account_registration_from_settings.rb b/db/migrate/20200530172450_delete_disable_account_registration_from_settings.rb new file mode 100644 index 000000000..e92b25783 --- /dev/null +++ b/db/migrate/20200530172450_delete_disable_account_registration_from_settings.rb @@ -0,0 +1,11 @@ +class DeleteDisableAccountRegistrationFromSettings < ActiveRecord::Migration[5.2] + def self.up + return unless HackathonConfig.find_by(var: 'disable_account_registration').present? + HackathonConfig.find_by(var: 'disable_account_registration').destroy + end + + def self.down + return unless HackathonConfig.find_by(var: 'disable_account_registration').nil? + HackathonConfig.create(var: 'disable_account_registration', value: false).save + end +end diff --git a/db/schema.rb b/db/schema.rb index 42ae1fab4..7041720db 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_02_05_160318) do +ActiveRecord::Schema.define(version: 2020_05_30_172450) do create_table "active_storage_attachments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name", null: false @@ -193,8 +193,6 @@ end create_table "questionnaires", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| - t.string "first_name" - t.string "last_name" t.date "date_of_birth" t.string "experience" t.string "school_id" @@ -300,6 +298,8 @@ t.integer "role", default: 0 t.boolean "is_active", default: true t.boolean "receive_weekly_report", default: false + t.string "first_name" + t.string "last_name" t.index ["email"], name: "index_users_on_email", unique: true t.index ["provider"], name: "index_users_on_provider" t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true diff --git a/db/seed_messages/questionnaire--denied.md b/db/seed_messages/questionnaire--denied.md index b9449ae53..8763f3ea7 100644 --- a/db/seed_messages/questionnaire--denied.md +++ b/db/seed_messages/questionnaire--denied.md @@ -1,9 +1,3 @@ - diff --git a/db/seed_messages/questionnaire--rsvp_reminder.md b/db/seed_messages/questionnaire--rsvp_reminder.md new file mode 100644 index 000000000..ad7577856 --- /dev/null +++ b/db/seed_messages/questionnaire--rsvp_reminder.md @@ -0,0 +1,12 @@ +## Missing RSVP + +
+

Are you coming to {{hackathon_name}}?

+

Let us know if we should expect you there!

+

+ Yes, I will Attend » + No, I Can't Attend » +
+ Link not working? Go to {{rsvp_url}} +

+
\ No newline at end of file diff --git a/db/seed_messages/user--24hr_incomplete_application.md b/db/seed_messages/user--24hr_incomplete_application.md index 3cd5277df..7b35464b0 100644 --- a/db/seed_messages/user--24hr_incomplete_application.md +++ b/db/seed_messages/user--24hr_incomplete_application.md @@ -1,10 +1,10 @@ ## Finish Your Application -You're almost there! You completed the My MLH part of the application, but didn't finish the additional {{hackathon_name}}-specific questions. +You're almost there! You created an account, but didn't finish the additional {{hackathon_name}}-specific questions. -Your application will not be considered until it is completed. +You will not be considered until an application is completed. -Not to worry! Just [head on back to the website]({{apply_url}}), sign in with your existing My MLH account (if necessary), and complete the application. +Not to worry! Just [head on back to the website]({{apply_url}}), sign in with your existing account, and complete the application. Finish Application » diff --git a/db/seeds.rb b/db/seeds.rb index ecf86a7fd..b72203e26 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -15,6 +15,7 @@ "questionnaire.accepted" => "You've been accepted!", "questionnaire.denied" => "Your application status", "questionnaire.rsvp_confirmed" => "RSVP Confirmation", + "questionnaire.rsvp_reminder" => "Are you coming to #{HackathonConfig['name']}?", "user.24hr_incomplete_application" => "Incomplete application", "bus_list.new_captain_confirmation" => "You're a bus captain!", "bus_list.update_notes" => "Bus Update" @@ -25,6 +26,7 @@ "questionnaire.accepted" => "Accepted email", "questionnaire.denied" => "Denied email", "questionnaire.rsvp_confirmed" => "RSVP confirmed email", + "questionnaire.rsvp_reminder" => "RSVP Reminder", "user.24hr_incomplete_application" => "Incomplete application (24-hour reminder)", "bus_list.new_captain_confirmation" => "New bus captain confirmation", "bus_list.update_notes" => "Bus list update" @@ -55,11 +57,19 @@ puts "Seeding school list..." -csv_file = File.join(File.dirname(__FILE__), 'schools.csv') -csv_text = File.read(csv_file) +school_csv_file = File.join(File.dirname(__FILE__), 'schools.csv') +csv_text = File.read(school_csv_file) csv = CSV.parse(csv_text, headers: true) csv.each do |row| School.create(row.to_hash) end +puts "Seeding fips list..." +fips_csv_file = File.join(File.dirname(__FILE__), 'fips.csv') +fips_csv_text = File.read(fips_csv_file) +fips_csv = CSV.parse(fips_csv_text, headers: true) +fips_csv.each do |row| + Fips.create(row.to_hash) +end + puts "Done" diff --git a/docs/api.md b/docs/api-overview.md similarity index 66% rename from docs/api.md rename to docs/api-overview.md index 924e4b005..ac81471f9 100644 --- a/docs/api.md +++ b/docs/api-overview.md @@ -1,48 +1,48 @@ --- -id: api -title: API Usage +id: api-overview +title: Overview --- -Almost all of the functionality exposed to users can also be accessed as an API with OAuth credentials. This includes both public- and management-facing functionality. +## Introduction -**Please note:** HackathonManager's primary audience is the web interface. +Almost all of the functionality exposed to users can also be accessed as an API with OAuth credentials. This includes both public and management-facing functionality. -While functionality may co-exist for both browser and API usage, API-style support might be a little rough around some edges. If you stumble upon something that works a little different than usual (e.g. returns HTML instead of JSON), open an issue and we can figure it out. +**Please note:** HackathonManager's primary audience is the web interface. The API is currently being rewritten to support more application-based functionality, however this is still a work in progress, and not all functions will be supported on version `2.0`. -## Endpoints +If you run into any inconsistencies, feel free to open an issue on the [hackathon-manager](https://github.com/codeRIT/hackathon-manager) repo. -Endpoints are shared with regular page controllers for browser-style functionality. This leverages Ruby on Rails routing (for a deep dive, see [Rails Routing from the Outside In](https://guides.rubyonrails.org/routing.html)). +## Endpoints -For example, listing bus lists: +> Note that endpoints are currently being rewritten to support more user-based access, rather than hiding most information under an admin-level restriction. -- User-facing page: https://apply.brickhack.io/manage/bus_lists -- API endpoint: https://apply.brickhack.io/manage/bus_lists.json +Endpoints are shared with regular page controllers for browser-style functionality. This leverages Ruby on Rails routing (for a deep dive, see [Rails Routing from the Outside In](https://guides.rubyonrails.org/routing.html)). Because Rails follows a standard CRUD-format, these endpoints become very REST-like. For example: -- List all tags: `GET https://apply.brickhack.io/manage/trackable_tags.json` -- View specific tag: `GET https://apply.brickhack.io/manage/trackable_tags/1.json` -- Create tag: `POST https://apply.brickhack.io/manage/trackable_tags.json` (with a JSON body of parameters) -- Update tag: `PATCH https://apply.brickhack.io/manage/trackable_tags/1.json` (with a JSON body of parameters) -- Delete tag: `DELETE https://apply.brickhack.io/manage/trackable_tags/1.json` +| Action | Reuqest | +|-------------------|--------------------------------------------------------------------------------------------------| +| List all tags | `GET https://your-hackathon.io/manage/trackable_tags.json` | +| View specific tag | `GET https://your-hackathon.io/manage/trackable_tags/1.json` | +| Create tag | `POST https://your-hackathon.io/manage/trackable_tags.json` (with body parameters) | +| Update tag | `PATCH https://your-hackathon.io/manage/trackable_tags/1.json` (with body parameters) | +| Delete tag | `DELETE https://your-hackathon.io/manage/trackable_tags/1.json` | + +For a full list of endpoints, run `bin/rails routes` locally. This utility, provided by Ruby on Rails, lists all possible paths you can route to (along with their respective HTTP method). -For a full list of endpoints, run `bin/rails routes` locally. This utility, provided by Ruby on Rails, lists all possible paths you can route too (along with their respective HTTP method). +> Note: Datatable endpoints are highly coupled to [Datatables](https://datatables.net) functionality and are not easy to use. -**Note: datatable endpoints** are highly coupled to [Datatables](https://datatables.net) functionality and are not easy to use. +> Note: The following endpoints are currently being rewritten to allow for less restrictions, i.e., bypassing the `/manage/`-level permission. Example for questionnaire management endpoints: ``` -... Prefix Verb URI Pattern Controller#Action datatable_manage_questionnaires POST /manage/questionnaires/datatable(.:format) manage/questionnaires#datatable check_in_manage_questionnaire PATCH /manage/questionnaires/:id/check_in(.:format) manage/questionnaires#check_in - convert_to_admin_manage_questionnaire PATCH /manage/questionnaires/:id/convert_to_admin(.:format) manage/questionnaires#convert_to_admin update_acc_status_manage_questionnaire PATCH /manage/questionnaires/:id/update_acc_status(.:format) manage/questionnaires#update_acc_status bulk_apply_manage_questionnaires PATCH /manage/questionnaires/bulk_apply(.:format) manage/questionnaires#bulk_apply - message_events_manage_questionnaire GET /manage/questionnaires/:id/message_events(.:format) manage/questionnaires#message_events manage_questionnaires GET /manage/questionnaires(.:format) manage/questionnaires#index POST /manage/questionnaires(.:format) manage/questionnaires#create new_manage_questionnaire GET /manage/questionnaires/new(.:format) manage/questionnaires#new @@ -52,10 +52,9 @@ update_acc_status_manage_questionnaire PATCH /manage/questionnaires/:id/updat PUT /manage/questionnaires/:id(.:format) manage/questionnaires#update DELETE /manage/questionnaires/:id(.:format) manage/questionnaires#destroy datatable_manage_checkins POST /manage/checkins/datatable(.:format) -... ``` -## Request & response +## Request & Response Most endpoints can operate with JSON requests & responses. Simply provide `.json` at the end of the URL to be returned JSON, and provide `Content-Type: application/json` when using POST or PATCH with a JSON body. @@ -72,13 +71,11 @@ end - This "show" endpoint is the natural mapping for something like `GET /manage/questionnaires/1.json` - Because `respond_with` is used, it will return JSON when `.json` is used in the URL -# Authentication - -Authentication is implemented with OAauth 2, provided by the [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) gem. +## Authentication -An OAuth app should be created by an admin at https://apply.your-hackathon.com/oauth/applications. From there, you can implement a standard OAuth 2 flow. +Authentication is implemented with OAauth 2, provided by the [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) gem. For full Doorkeeper endpoints + docs, see the [Doorkeeper wiki](https://github.com/doorkeeper-gem/doorkeeper/wiki/API-endpoint-descriptions-and-examples). -For Doorkeeper endpoints + docs, see https://github.com/doorkeeper-gem/doorkeeper/wiki/API-endpoint-descriptions-and-examples +See the [Setup Postman/Paw for API Testing](api-testing-setup.md) page for information on using those tools for testing the API locally. Once appropriate authentication credentials are retrieved, they should be provided on all API requests. diff --git a/docs/api-testing-setup.md b/docs/api-testing-setup.md new file mode 100644 index 000000000..c4767b5a0 --- /dev/null +++ b/docs/api-testing-setup.md @@ -0,0 +1,70 @@ +--- +id: api-testing-setup +title: Testing Setup +--- + +This page will show you how to simulate API requests with [Postman](https://www.postman.com/) or [Paw](https://paw.cloud/). + +These programs allow you to run API requests (`GET`, `POST`, and so on) in an isolated environment, which is much easier to debug in compared to an iOS or Android app, for example. + +In order to make requests in either Postman or Paw, you need to setup _OAuth 2 authorization_, as in HackathonManager, each request needs to be authorized first. This guide discusses how to enable OAuth 2 for these apps. + +This guide assumes you have already setup an account with Director status on a local HackathonManager instance. For more details on this, see the [main README](https://github.com/codeRIT/hackathon-manager#local-development). + +> To make API requests on a live/remote instance, simply replace `localhost` in all following commands with your HackathonManager's URL. + +Select an app below to jump directly to its guide: + +- [Connecting with Postman](#initial-setup-with-postman) +- [Connecting with Paw](#initial-setup-with-paw) + +## OAuth2 Notes + +- The application only supports `Authorization Code` and `Implicit Grant` authorization methods. It's suggested to use an `implicit` grant for native apps, as they are inherently trusted. +- In a real application, the callback URL should have a specific scope that's not just `http://`, i.e., `brickhack-ios://` (for BrickHack's iOS application). However Postman would really be confused with that scheme, so for local development, it's not advised. +- Client credentials must be sent in the body. +- Browser authorization is currently not supported, at least in Postman. Not sure why! If you discover a reason, please open an Issue on the [Hackathon Manager](https://github.com/codeRIT/hackathon-manager) repo. + +## Connecting with Postman + +In HackathonManager, sign in to your staff account and click "Manage". Then, at the bottom left of the sidebar, click the **Doorkeeper** tab. + + + +On this screen, click `New Application`. + +Name it whatever you wish. Set the Redirect URI to `http://localhost:3000/apply`, uncheck `Confidential`, and set a scope to `main`. Then, click `Submit`. + +> Note: There is [a bug](https://github.com/doorkeeper-gem/doorkeeper/issues/1307) in the current version of doorkeeper (5.0), where if you do not put a scope, all OAuth requests fail. This scope can be anything as long as it is not empty. + +Now, go to Postman and configure the initial request as follows: + + + +Then, click the `Get Access Token` button. + +On this screen, fill out the information but with your own keys from the image above. + + + +You should get a popup with your hackathon's sign in screen. Type in your staff credentials and log in. + +On the next screen, select `Authorize`: + + + +You should see this resulting screen. On here, select `Use Token`: + + + +That's it! Now you can make authorized requests at whatever permission level your account has. + + + +## Connecting with Paw + +The process is very similar to above. To save time, here is a screenshot of the `auth` config screen: + + + +To reset your login, remove the dynamic fields in `Refresh Token` and `Token`. If your web login is still cached, try clearing cookies (`Paw > Web Views > Clear Cookies`) and Cache (`Paw > Web Views > Clear Cache`). diff --git a/docs/assets/api-setup/authorize.png b/docs/assets/api-setup/authorize.png new file mode 100644 index 000000000..57db52799 Binary files /dev/null and b/docs/assets/api-setup/authorize.png differ diff --git a/docs/assets/api-setup/doorkeeper.png b/docs/assets/api-setup/doorkeeper.png new file mode 100644 index 000000000..43203d19b Binary files /dev/null and b/docs/assets/api-setup/doorkeeper.png differ diff --git a/docs/assets/api-setup/paw1.png b/docs/assets/api-setup/paw1.png new file mode 100644 index 000000000..66c77e12d Binary files /dev/null and b/docs/assets/api-setup/paw1.png differ diff --git a/docs/assets/api-setup/postman1.png b/docs/assets/api-setup/postman1.png new file mode 100644 index 000000000..b984eb5dc Binary files /dev/null and b/docs/assets/api-setup/postman1.png differ diff --git a/docs/assets/api-setup/postman2.png b/docs/assets/api-setup/postman2.png new file mode 100644 index 000000000..798de56e6 Binary files /dev/null and b/docs/assets/api-setup/postman2.png differ diff --git a/docs/assets/api-setup/postman3.png b/docs/assets/api-setup/postman3.png new file mode 100644 index 000000000..01c8fb0ae Binary files /dev/null and b/docs/assets/api-setup/postman3.png differ diff --git a/docs/assets/api-setup/postman4.png b/docs/assets/api-setup/postman4.png new file mode 100644 index 000000000..cad8abdf3 Binary files /dev/null and b/docs/assets/api-setup/postman4.png differ diff --git a/docs/assets/api-setup/postman5.png b/docs/assets/api-setup/postman5.png new file mode 100644 index 000000000..d15161e54 Binary files /dev/null and b/docs/assets/api-setup/postman5.png differ diff --git a/docs/busses.md b/docs/busses.md index 67181bbb0..cff5516cd 100644 --- a/docs/busses.md +++ b/docs/busses.md @@ -1,7 +1,7 @@ --- id: busses -title: Busses -sidebar_label: Busses +title: Bus Lists +sidebar_label: Bus Lists --- HackathonManager enables you to facilitate bus sign-ups for attendees during the RSVP process. diff --git a/docs/customization.md b/docs/customization.md index bfdfd60d2..205361771 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -9,11 +9,13 @@ Be sure to review all of these before going live! Various settings are available at http://your-site/manage/configs - be sure to review all of them! -## Emails +## Default Messages -Default automated emails are loaded into http://your-site/manage/messages. +Default automated Messages (or emails) are loaded into http://your-site/manage/messages. Please note some of the default Messages supplied are **awaiting content to be entered**. It is critical that all default Messages be reviewed to fit the needs of a particular hackathon. -The default email layout/template can also be customized if desired. Scroll to the bottom of http://your-site/manage/messages to customize. +The default Message layout/template can also be customized if desired. Scroll to the bottom of http://your-site/manage/messages to customize. + +To learn more about Messages and its capabilities, review the [Messages Guide](messages). ## Styling diff --git a/docs/deployment-dokku.md b/docs/deployment-dokku.md index 224e629a6..0b080214d 100644 --- a/docs/deployment-dokku.md +++ b/docs/deployment-dokku.md @@ -6,36 +6,18 @@ title: Dokku Deployment >These docs assume you already have a virtual machine with [Dokku](http://dokku.viewdocs.io/dokku/) running on it, and can SSH into the VM. DNS should be set up as well, but isn't required for bare minimum functionality. > >If you need a VM, check out [DigitalOcean](https://m.do.co/c/b5ee103e23c3) or [Linode](https://www.linode.com/?r=e90a6fb2a6999fb4ec7b60b1add3e288f97954bf) and the [Dokku docs](http://dokku.viewdocs.io/dokku/) to get started. - -## Updating an existing deployment - -If you already have a deployment of HackathonManager on Dokku, follow these steps to update it. - -* If you already have the hackathon-manager repo cloned locally: -```bash -# cd into the directory you have hackathon-manager cloned -cd hackathon-manager -git pull -# Skip to "git push" if you already added the remote -git remote add dokku dokku@your-host.example.com:hm -git push dokku master -``` - -* If you don't have it cloned locally: -```bash -git clone git@github.com:codeRIT/hackathon-manager -cd hackathon-manager -git remote add dokku dokku@your-host.example.com:hm -git push dokku master -``` +> +>**Student Developer?** The [GitHub Student Developer Pack](https://education.github.com/pack?sort=popularity&tag=Cloud) has several discounts for cloud hosting, Ruby tutorials, and more! ## Setting up a new deployment -Below are steps & notes to deploy HackathonManager on Dokku. +Below are steps to deploy a new HackathonManager instance on Dokku. To update an existing Dokku deployment, check out our [updating docs](updating-hm.html). + +If you have any questions, please don't hesitate to reach out to the [codeRIT Engineering Team](mailto:engineering@coderit.org)! This doc is very much a work in progress but we want to keep it as up to date as possible. -If you have any questions at all, please don't hesitate to reach out to [Stuart](https://github.com/sman591)! This doc is very much a work in progress but we want to keep it as up to date as possible. +## Dokku Setup -## Dokku plugins +### Plugins Currently used and required Dokku plugins (other than the defaults): @@ -43,9 +25,9 @@ Currently used and required Dokku plugins (other than the defaults): - [Redis](https://github.com/dokku/dokku-redis) (background jobs + caching) - [dokku-letsencrypt](https://github.com/dokku/dokku-letsencrypt) (Optional: free, automated SSL certificates) -### Dokku Setup Steps +### Setup Steps -**We'll be using `hm` as the app name in these steps,** as well as sharing the same `hm` name for both the app, database, and redis name. You're free to use another names. +**We'll be using `hm` as the app name in these steps,** as well as sharing the same `hm` name for both the app, database, and redis name. You're free to use other names. ```bash dokku apps:create hm @@ -125,14 +107,14 @@ dokku letsencrypt hm - Deploy should succeed without any red flags in the build log - Should be able to submit an application on the website & receive an immediate confirmation email -### Promote account to admin +### Promote account to director ```bash dokku enter hm web # Wait for a bash shell to start... $ bin/rails c # Wait for the Rails console to start... -User.find_by(email: "your-email@example.com").update_attribute(:role, :admin) +User.find_by(email: "your-email@example.com").update_attribute(:role, :director) exit exit ``` diff --git a/docs/deployment-environment-variables.md b/docs/deployment-environment-variables.md index 6cb84d22b..bab6f0887 100644 --- a/docs/deployment-environment-variables.md +++ b/docs/deployment-environment-variables.md @@ -3,31 +3,21 @@ id: deployment-environment-variables title: Environment Variables --- -Various services require environment variables to operate. +Various services require environment variables to operate. While they may appear overwhelming, this setup guide aims to alleviate some of the concern. -**The following environment variables should be present on all deployments.** Below is an example: +> Stuck on an environment variable? codeRIT is here to help! [Send us an email](mailto:engineering@coderit.org) with any questions. + +## Required +**The following environment variables are required for HackathonManager to function.** + +### Secret keys ```bash SECRET_KEY_BASE="" DEVISE_SECRET_KEY="" -HM_DOMAIN_NAME="apply.example.com" -MLH_KEY="my-mlh-application-id" -MLH_SECRET="my-mlh-secret" -AWS_BUCKET="my-example-bucket" -AWS_ACCESS_KEY_ID="" -AWS_SECRET_ACCESS_KEY="" -AWS_REGION="us-east-1" -ROLLBAR_ACCESS_TOKEN="" -SPARKPOST_API_KEY="" -SPARKPOST_CAMPAIGN_ID="my-hackathon" -TIME_ZONE="America/New_York" ``` -_Also see [app.json](https://github.com/codeRIT/hackathon_manager/blob/master/app.json)_ - -### Secret keys - -`SECRET_KEY_BASE` and `DEVISE_SECRET_KEY` are required for the app to run. You can generate secrets via `bundle exec rake secret`. This "secret" is a 64-byte hexadecimal string (128 characters). You could also generate this with `head -c 64 /dev/urandom | xxd -ps -c 128` if you are on a standard Linux distribution. +You can generate secrets via `bundle exec rake secret`. This "secret" is a 64-byte hexadecimal string (128 characters). You could also generate this with `head -c 64 /dev/urandom | xxd -ps -c 128` if you are on a standard Linux distribution. ### Mailer domain @@ -36,9 +26,9 @@ HM_DOMAIN_NAME="" HM_DOMAIN_PROTOCOL="" # optional, https by default ``` -### Resumes and S3 +This is needed to allow HackathonManager to send email on behalf of your hackathon's domain. -Resumes are stored locally in development and on S3 in production. +### Amazon S3 and Resumes ```bash AWS_BUCKET="" @@ -47,6 +37,9 @@ AWS_SECRET_ACCESS_KEY="" AWS_REGION="" ``` +Resumes for hackers are stored on [Amazon S3](https://aws.amazon.com/s3/). + +### Other providers If you're using a third-party S3 provider, such as [Minio](https://min.io), also specify the custom endpoint. ```bash @@ -61,20 +54,20 @@ S3_FORCE_PATH_STYLE=true ### E-mail -Emails can be sent using [SparkPost](https://www.sparkpost.com) or traditional SMTP. +Emails can be sent using [SendGrid](https://sendgrid.com) or traditional SMTP. -#### SparkPost +#### SendGrid -[SparkPost](https://www.sparkpost.com) is the recommended email provider, and provides a free plan suitable for most hackathons. +```bash +SENDGRID_API_KEY="" +``` -Create a SparkPost API key with **Transmissions: Read/Write** and **Message Events: Read-only** permissions. The SMTP permission is _not_ required, as email is sent over the SparkPost API instead of SMTP. +[SendGrid](https://sendgrid.com) is the recommended email provider, and provides a free plan suitable for most hackathons. -For added security, whitelist the API key to your server's IP address. +Create a SendGrid API key to get started. During the setup process you will be asked to authenticate your sending domain with SendGrid. For guidance on this process please visit [SendGrid Domain Authentication Support](https://sendgrid.com/docs/ui/account-and-settings/how-to-set-up-domain-authentication/). If you would like to maintain your sending reputation and stay out of the spam folder, we reccomend enabling [SendGrid Link Branding](https://sendgrid.com/docs/ui/account-and-settings/how-to-set-up-link-branding/) when asked during the setup process. -```bash -SPARKPOST_API_KEY="" -SPARKPOST_CAMPAIGN_ID="" -``` + +>During the verification process ensure you have replaced `hello@example.com` with your own domain in your HackathonManager config. SendGrid will deny the email as you are not authenticated to send on behalf of `example.com`. #### SMTP @@ -91,45 +84,43 @@ SMTP_AUTHENTICATION="" # optional, "plain" by default SMTP_STARTTLS_AUTO="" # optional, "true" by default ``` -### Rollbar +### Time Zone -Rollbar captures and notifies of errors in production, and requires a server-side access token. +>HackathonManager will crash at startup if the time zone isn't valid. +> +>To find your appropriate time zone (e.g. `America/New_York`), see "TZ database name" on [Wikipedia](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) ```bash -ROLLBAR_ACCESS_TOKEN="" +TIME_ZONE="America/Los_Angeles" ``` -### My MLH +By default, charts & timestamps will be in UTC. -My MLH provides us authentication & initial application information. +## Optional +**The following environment variables are optional but add additional functionality.** -1. Create an account at https://my.mlh.io -2. Click "My Apps" in the top navbar -3. Click "Create new app" -4. Fill out the app name & logo -5. For "Redirect URI", fill in https://apply.your-hackathon.com/users/auth/mlh/callback +### MyMLH ```bash MLH_KEY="" MLH_SECRET="" ``` -### Time Zone +[MyMLH](https://my.mlh.io/) makes it easy for hackers to quickly onboard themselves into HackathonManager. With MyMLH, hackers can save time by skipping fields in the questionnaire where the answer is already provided on their MyMLH profiles. -By default, charts & timestamps will be in UTC. +1. Create an account at https://my.mlh.io +2. Click "My Apps" in the top navbar +3. Click "Create new app" +4. Fill out the app name & logo +5. For "Redirect URI", fill in https://apply.your-hackathon.com/users/auth/mlh/callback ->HackathonManager will crash at startup if the time zone isn't valid. -> ->To find your appropriate time zone (e.g. `America/New_York`), see "TZ database name" on [Wikipedia](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) +### Rollbar ```bash -TIME_ZONE="America/Los_Angeles" +ROLLBAR_ACCESS_TOKEN="" ``` -### Skylight +[Rollbar](https://rollbar.com/) captures and notifies of errors in production, and requires a server-side access token. + -Skylight provides detailed performance analytics for the app, if you chose to use it. -```bash -SKYLIGHT_AUTHENTICATION="" -``` diff --git a/docs/deployment-heroku.md b/docs/deployment-heroku.md index 4bf3cb200..8382306b7 100644 --- a/docs/deployment-heroku.md +++ b/docs/deployment-heroku.md @@ -7,7 +7,7 @@ Heroku deployment is pretty straightforward thanks to Heroku's one-click deploys Click the button below to start. You'll be prompted to fill out a few questions and environment variables. -**See [Environment Variables](deployment-environment-variables.md) for all required environment variables** +**See [Environment Variables](deployment-environment-variables.md) for all required environment variables and what they do.** [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/codeRIT/hackathon-manager) diff --git a/docs/deployment-okd.md b/docs/deployment-okd.md index 69c00fcf8..23468082f 100644 --- a/docs/deployment-okd.md +++ b/docs/deployment-okd.md @@ -152,7 +152,7 @@ spec: 1. Seed the database (schools, emails, etc) -- do this **before** you create your first user 2. Apply as a hacker -3. Manually promote your (first) account to an admin +3. Manually promote your (first) account to a director 4. Configure your hackathon ### Seed the database @@ -170,7 +170,7 @@ exit 1. Open your hackathon's website, create an account, and complete an application 2. Validate that you received a confirmation email (if you didn't, don't fix it now, but take note for later) -### Manually promote your account to admin status +### Manually promote your account to director status 1. On the OKD website, navigate to the currently-running HackathonManager pod (Applications -> Pods -> Click the HM pod in the list) 2. In the tab bar, click "Terminal" @@ -178,7 +178,7 @@ exit ```bash bin/rails c # Wait for the Rails console to start... -User.find_by(email: "your-email@example.com").update_attribute(:role, :admin) +User.find_by(email: "your-email@example.com").update_attribute(:role, :director) exit exit ``` diff --git a/docs/deployment.md b/docs/deployment.md index 1c5e0430c..0111c8dbf 100755 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -1,6 +1,6 @@ --- id: deployment -title: Deployment +title: Getting Started --- HackathonManager is a standalone web app separate from your regular marketing website/public homepage. @@ -20,13 +20,15 @@ Easiest & quickest way that requires little server knowledge. Recommended if you aren't familiar with running a Linux virtual machine and can spend ~$17/month. +> **Student Developer?** You can get a free [Hobby dyno](https://devcenter.heroku.com/articles/dyno-types) for up two 2 years with the [GitHub Student Developer Pack](https://education.github.com/pack). [More info...](https://www.heroku.com/github-students) + [Get Started with Heroku »](deployment-heroku.md) ## Dokku A free alternative to Heroku, runs on your own virtual machine. -Recommended if you're on a budget and can set up Dokku on a Linux virtual machine, usually $5-10/month. +Recommended if you're on a budget and can set up Dokku on a Linux virtual machine, usually $5-10/month with services like Amazon Web Services, Google Cloud, and others. This method is free if running on premises with an always on virtual machine. [Get Started with Dokku »](deployment-dokku.md) diff --git a/docs/running-a-hackathon.md b/docs/docs-overview.md similarity index 83% rename from docs/running-a-hackathon.md rename to docs/docs-overview.md index f7f409314..00554b945 100755 --- a/docs/running-a-hackathon.md +++ b/docs/docs-overview.md @@ -1,16 +1,17 @@ --- -id: running-a-hackathon -title: Running a hackathon with HackathonManager -sidebar_label: Running a hackathon +id: docs-overview +title: HackathonManager Documentation +sidebar_label: Overview --- > HackathonManager is a full-service tool to run your hackathon from start to finish. -Guides to get you started: +Documentation to get you started: - [Timeline of a hackathon](#timeline) -- [Busses](busses.md) - [Questionnaires](questionnaires.md) +- [Messages](messages.md) +- [Bus Lists](busses.md) - _More to come..._ ## Timeline of a hackathon diff --git a/docs/getting-help.md b/docs/getting-help.md new file mode 100755 index 000000000..d17ff9e11 --- /dev/null +++ b/docs/getting-help.md @@ -0,0 +1,15 @@ +--- +id: resources +title: Resources +--- + +The HackathonManager community is here to help. While these docs are very much a work in progress, a lot of effort has gone into making HackathonManager as simple as possible to setup. If additional help is needed, resources can be found on this page. There is a large community of developers who want to see HackathonManager succeed so all questions are welcomed! + +> See an area in the docs we can improve on? Click the `EDIT` button on any page and open a pull request with the changes! Feedback from the community on our docs is **greatly appreciated**. + +## codeRIT Engineering +While outside development and collaboration on HackathonManager is much encouraged and appreciated, codeRIT oversees the development of the project. + +[Email codeRIT](mailto:engineering@coderit.org) - Send the codeRIT Engineering team an email with any questions or issues! + +> RIT organization using HackathonManager? We have a Slack for members of the RIT community! Ping codeRIT Engineering in #engineering at slack.coderit.org \ No newline at end of file diff --git a/docs/maintenance.md b/docs/maintenance.md new file mode 100644 index 000000000..78e8ada01 --- /dev/null +++ b/docs/maintenance.md @@ -0,0 +1,40 @@ +--- +id: updating-hm +title: Updating HackathonManager +--- + +We made it easy to update HackathonManager while in production. It's important to always keep HackathonManager up-to-date for new features and improvements. + +## Heroku + +If a deployment of HackathonManager already exists on Heroku, follow these steps to update it. + +> Ensure [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) is installed locally and is [authenticated](https://devcenter.heroku.com/articles/heroku-cli#getting-started) with an account permitted to push to the Heroku instance before continuing. + +```bash +# cd into the directory where hackathon-manager is cloned into +cd hackathon-manager +git pull +git push heroku master +``` +## Dokku + +If a deployment of HackathonManager already exists on Dokku, follow these steps to update it. + +* If HackathonManager is **already** cloned locally: +```bash +# cd into the directory where hackathon-manager is cloned into +cd hackathon-manager +git pull +# Skip to "git push" if remote is already added +git remote add dokku dokku@your-host.example.com:hm +git push dokku master +``` + +* If HackathonManager is **not yet** cloned locally: +```bash +git clone git@github.com:codeRIT/hackathon-manager +cd hackathon-manager +git remote add dokku dokku@your-host.example.com:hm +git push dokku master +``` diff --git a/docs/messages.md b/docs/messages.md index 673a50dc9..c47392f52 100644 --- a/docs/messages.md +++ b/docs/messages.md @@ -53,7 +53,7 @@ Automated emails can also be sent out upon certain events happening. All events * **Questionnaire status** — Upon being accepted, denied, RSVP'd, etc * **Bust list** — Becoming a passenger or bus captain -These messages are sent immediatley upon an applicant entering the given state. For example, when an admin marks someone as "accepted," they will immediately receive any automated messages assocaited with the "Questionnaire Status: Accepted" event. +These messages are sent immediatley upon an applicant entering the given state. For example, when a staff member marks someone as "accepted," they will immediately receive any automated messages assocaited with the "Questionnaire Status: Accepted" event. ## Message formatting diff --git a/package.json b/package.json index ee85667df..0c2ff6820 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "devDependencies": { "@semantic-release/changelog": "^5.0.1", "@semantic-release/git": "^9.0.0", - "semantic-release": "^17.0.7" + "semantic-release": "^17.1.1" }, "version": "0.0.0" } diff --git a/test/controllers/bus_lists_controller_test.rb b/test/controllers/bus_lists_controller_test.rb index c32066764..e50ecd7fc 100644 --- a/test/controllers/bus_lists_controller_test.rb +++ b/test/controllers/bus_lists_controller_test.rb @@ -19,7 +19,7 @@ class BusListsControllerTest < ActionController::TestCase context "while authenticated without a questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] @user = create(:user, email: "newabc@example.com") sign_in @user end @@ -37,7 +37,7 @@ class BusListsControllerTest < ActionController::TestCase context "while authenticated with a questionnaire but no bus list" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user @questionnaire.update_attribute(:acc_status, "accepted") end @@ -55,7 +55,7 @@ class BusListsControllerTest < ActionController::TestCase context "while authenticated with a questionnaire with a bus list" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user @questionnaire.update_attribute(:acc_status, "accepted") @bus_list = create(:bus_list) diff --git a/test/controllers/manage/bus_lists_controller_test.rb b/test/controllers/manage/bus_lists_controller_test.rb index c03b743b8..1d12d9363 100644 --- a/test/controllers/manage/bus_lists_controller_test.rb +++ b/test/controllers/manage/bus_lists_controller_test.rb @@ -137,10 +137,76 @@ class Manage::BusListsControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to manage_bus_lists#index" do + get :index + assert_response :success + end + + should "allow access to manage_bus_lists#show" do + get :show, params: { id: @bus_list } + assert_response :success + end + + should "not allow access to manage_bus_lists#new" do + get :new + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#edit" do + get :edit, params: { id: @bus_list } + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#create" do + post :create, params: { bus_list: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#update" do + patch :update, params: { id: @bus_list, bus_list: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#toggle_bus_captain" do + questionnaire = create(:questionnaire) + assert_difference "enqueued_jobs.size", 0 do + patch :toggle_bus_captain, params: { id: @bus_list, questionnaire_id: questionnaire.id, bus_captain: "1" } + end + assert_equal false, questionnaire.reload.is_bus_captain + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#send_update_email" do + assert_difference "enqueued_jobs.size", 0 do + patch :send_update_email, params: { id: @bus_list } + end + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#destroy" do + patch :destroy, params: { id: @bus_list } + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -203,9 +269,9 @@ class Manage::BusListsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) + @user = create(:director) @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/checkins_controller_test.rb b/test/controllers/manage/checkins_controller_test.rb index 58d2f6df3..6b92b4276 100644 --- a/test/controllers/manage/checkins_controller_test.rb +++ b/test/controllers/manage/checkins_controller_test.rb @@ -15,7 +15,7 @@ class Manage::CheckinsControllerTest < ActionController::TestCase setup do if do_sign_in @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end end @@ -43,7 +43,7 @@ class Manage::CheckinsControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -52,42 +52,17 @@ class Manage::CheckinsControllerTest < ActionController::TestCase end end - limited_conditions = { - 'event tracking user' => :event_tracking, - } - - limited_conditions.each do |condition_name, user_role| - context "while authenticated as a #{condition_name}" do - setup do - @user = create(:user, role: user_role) - @request.env["devise.mapping"] = Devise.mappings[:admin] - sign_in @user - end - - should "not get index" do - test_index_failure - end - - should "not show checkin" do - test_show_failure - end - - should "not render checking datatable" do - test_datatable_failure - end - end - end - success_conditions = { - 'limited access admin' => :admin_limited_access, - 'admin' => :admin + 'volunteer' => :volunteer, + 'organizer' => :organizer, + 'director' => :director } success_conditions.each do |condition_name, user_role| context "while authenticated as a #{condition_name}" do setup do @user = create(:user, role: user_role) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end diff --git a/test/controllers/manage/configs_controller_test.rb b/test/controllers/manage/configs_controller_test.rb index 038423fa4..826bb3043 100644 --- a/test/controllers/manage/configs_controller_test.rb +++ b/test/controllers/manage/configs_controller_test.rb @@ -31,7 +31,7 @@ class Manage::ConfigsControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -61,10 +61,10 @@ class Manage::ConfigsControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -91,10 +91,40 @@ class Manage::ConfigsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as an organizer" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "not allow access to manage_configs#index" do + get :index + assert_response :redirect + end + + should "not allow access to manage_configs#edit" do + get :edit, params: { id: "registration_is_open" } + assert_response :redirect + end + + should "not update config" do + HackathonConfig["registration_is_open"] = false + patch :update, params: { id: "registration_is_open", hackathon_config: { registration_is_open: "true" } } + assert_equal false, HackathonConfig["registration_is_open"] + end + + should "not update css config" do + HackathonConfig["custom_css"] = "" + patch :update_only_css_variables, params: { id: "custom_css", hackathon_config: { custom_css: ":root {\n --foo: #fff;\n}" } } + assert_equal "", HackathonConfig["custom_css"] + end + end + + context "while authenticated as a director" do + setup do + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/dashboard_controller_test.rb b/test/controllers/manage/dashboard_controller_test.rb index 021def962..f473968e6 100644 --- a/test/controllers/manage/dashboard_controller_test.rb +++ b/test/controllers/manage/dashboard_controller_test.rb @@ -12,21 +12,156 @@ class Manage::DashboardControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end - should "allow access to manage_dashboard#index" do + should "not allow access to manage_dashboard#index" do get :index assert_response :redirect assert_redirected_to root_path end + + should "not allow access to all data endpoints" do + school1 = FactoryBot.create(:school) + school2 = FactoryBot.create(:school) + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "pending") + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "accepted") + FactoryBot.create_list(:questionnaire, 10, school_id: school2.id, acc_status: "accepted") + Questionnaire::POSSIBLE_ACC_STATUS.each do |status, _name| + FactoryBot.create_list(:questionnaire, 1, school_id: school2.id, acc_status: status) + end + + stub_request(:get, "https://geocoding.geo.census.gov/geocoder/locations/address?street=123+Fake+Street&city=Rochester&state=NY&benchmark=Public_AR_Current&format=json") + .to_return(status: 200, body: '{ "result":{ "addressMatches":[{ "coordinates":{ "x": 100, "y": 100 } }] } }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + stub_request(:get, "https://geo.fcc.gov/api/census/area?format=json&lat=100&lon=100") + .to_return(status: 200, body: '{ "results":[{ "country_fips":1234 }] }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + + paths = [ + :todays_activity_data, + :todays_stats_data, + :checkin_activity_data, + :confirmation_activity_data, + :application_activity_data, + :schools_confirmed_data, + :user_distribution_data, + :application_distribution_data, + :schools_applied_data + ] + + paths.each do |path| + get path + assert_redirected_to root_path + end + + get :map_data, format: "tsv" + assert_redirected_to root_path + end + end + + context "while authenticated as a volunteer" do + setup do + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:director] + sign_in @user + end + + should "not allow access to manage_dashboard#index" do + get :index + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to all data endpoints" do + school1 = FactoryBot.create(:school) + school2 = FactoryBot.create(:school) + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "pending") + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "accepted") + FactoryBot.create_list(:questionnaire, 10, school_id: school2.id, acc_status: "accepted") + Questionnaire::POSSIBLE_ACC_STATUS.each do |status, _name| + FactoryBot.create_list(:questionnaire, 1, school_id: school2.id, acc_status: status) + end + + stub_request(:get, "https://geocoding.geo.census.gov/geocoder/locations/address?street=123+Fake+Street&city=Rochester&state=NY&benchmark=Public_AR_Current&format=json") + .to_return(status: 200, body: '{ "result":{ "addressMatches":[{ "coordinates":{ "x": 100, "y": 100 } }] } }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + stub_request(:get, "https://geo.fcc.gov/api/census/area?format=json&lat=100&lon=100") + .to_return(status: 200, body: '{ "results":[{ "country_fips":1234 }] }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + + paths = [ + :todays_activity_data, + :todays_stats_data, + :checkin_activity_data, + :confirmation_activity_data, + :application_activity_data, + :schools_confirmed_data, + :user_distribution_data, + :application_distribution_data, + :schools_applied_data + ] + + paths.each do |path| + get path + assert_redirected_to manage_checkins_path + end + + get :map_data, format: "tsv" + assert_redirected_to manage_checkins_path + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:director] + sign_in @user + end + + should "allow access to manage_dashboard#index" do + get :index + assert_response :success + end + + should "allow access to all data endpoints" do + school1 = FactoryBot.create(:school) + school2 = FactoryBot.create(:school) + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "pending") + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "accepted") + FactoryBot.create_list(:questionnaire, 10, school_id: school2.id, acc_status: "accepted") + Questionnaire::POSSIBLE_ACC_STATUS.each do |status, _name| + FactoryBot.create_list(:questionnaire, 1, school_id: school2.id, acc_status: status) + end + + stub_request(:get, "https://geocoding.geo.census.gov/geocoder/locations/address?street=123+Fake+Street&city=Rochester&state=NY&benchmark=Public_AR_Current&format=json") + .to_return(status: 200, body: '{ "result":{ "addressMatches":[{ "coordinates":{ "x": 100, "y": 100 } }] } }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + stub_request(:get, "https://geo.fcc.gov/api/census/area?format=json&lat=100&lon=100") + .to_return(status: 200, body: '{ "results":[{ "country_fips":1234 }] }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + + paths = [ + :todays_activity_data, + :todays_stats_data, + :checkin_activity_data, + :confirmation_activity_data, + :application_activity_data, + :schools_confirmed_data, + :user_distribution_data, + :application_distribution_data, + :schools_applied_data + ] + + paths.each do |path| + get path + assert_response :success + end + + get :map_data, format: "tsv" + assert_response :success + end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -45,10 +180,10 @@ class Manage::DashboardControllerTest < ActionController::TestCase FactoryBot.create_list(:questionnaire, 1, school_id: school2.id, acc_status: status) end - stub_request(:get, "https://maps.googleapis.com/maps/api/geocode/json?address=Rochester%20NY&sensor=true"). - to_return(status: 200, body: '{"results":[{"geometry":{"location":{"lat": 100, "lng": 100}}}]}', headers: {'Content-Type' => 'application/json; charset=UTF-8'}) - stub_request(:get, "https://geo.fcc.gov/api/census/area?format=json&lat=100&lon=100"). - to_return(status: 200, body: '{"results":[{"country_fips":1234}]}', headers: {'Content-Type' => 'application/json; charset=UTF-8'}) + stub_request(:get, "https://geocoding.geo.census.gov/geocoder/locations/address?street=123+Fake+Street&city=Rochester&state=NY&benchmark=Public_AR_Current&format=json") + .to_return(status: 200, body: '{ "result":{ "addressMatches":[{ "coordinates":{ "x": 100, "y": 100 } }] } }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + stub_request(:get, "https://geo.fcc.gov/api/census/area?format=json&lat=100&lon=100") + .to_return(status: 200, body: '{ "results":[{ "country_fips":1234 }] }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) paths = [ :todays_activity_data, diff --git a/test/controllers/manage/messages_controller_test.rb b/test/controllers/manage/messages_controller_test.rb index 291ee290a..c63245752 100644 --- a/test/controllers/manage/messages_controller_test.rb +++ b/test/controllers/manage/messages_controller_test.rb @@ -200,10 +200,110 @@ class Manage::MessagesControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "not allow access to manage_messages#index" do + get :index + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_messages datatables api" do + post :datatable, format: :json, params: { "columns[0][data]" => "" } + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_messages#new" do + get :new + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#show" do + get :show, params: { id: @message } + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_messages#edit" do + get :edit, params: { id: @message } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#create" do + post :create, params: { message: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#update" do + patch :update, params: { id: @message, message: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#destroy" do + patch :destroy, params: { id: @message } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not deliver message" do + assert_difference("enqueued_jobs.size", 0) do + patch :deliver, params: { id: @message } + end + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#preview" do + get :preview, params: { id: @message } + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_messages#live_preview" do + get :live_preview, params: { body: "foo bar" } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#duplicate" do + assert_difference("Message.count", 0) do + patch :duplicate, params: { id: @message } + end + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#template" do + test_template_failure + end + + should "not allow access to manage_messages#template_preview" do + test_template_preview_failure + end + + should "not allow access to manage_messages#template_update" do + test_template_update_failure + end + + should "not allow access to manage_messages#template_replace_with_default" do + test_template_replace_with_default_failure + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -296,9 +396,9 @@ class Manage::MessagesControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) + @user = create(:director) @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/questionnaires_controller_test.rb b/test/controllers/manage/questionnaires_controller_test.rb index 6e814b071..ab7f84023 100644 --- a/test/controllers/manage/questionnaires_controller_test.rb +++ b/test/controllers/manage/questionnaires_controller_test.rb @@ -5,7 +5,7 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase setup do @questionnaire = create(:questionnaire) - stub_request(:get, /api.sparkpost.com.*/).to_return(status: 200, body: "", headers: {}) + stub_request(:get, /api.sendgrid.com.*/).to_return(status: 200, body: "", headers: {}) end context "while not authenticated" do @@ -32,12 +32,6 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase assert_redirected_to new_user_session_path end - should "not allow access to manage_questionnaires#message_events" do - get :message_events, params: { id: @questionnaire } - assert_response :redirect - assert_redirected_to new_user_session_path - end - should "not allow access to manage_questionnaires#edit" do get :edit, params: { id: @questionnaire } assert_response :redirect @@ -45,19 +39,13 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase end should "not allow access to manage_questionnaires#create" do - post :create, params: { questionnaire: { first_name: "New" } } + post :create, params: { questionnaire: { major: "Computer Science" } } assert_response :redirect assert_redirected_to new_user_session_path end should "not allow access to manage_questionnaires#update" do - patch :update, params: { id: @questionnaire, questionnaire: { first_name: "New" } } - assert_response :redirect - assert_redirected_to new_user_session_path - end - - should "not allow convert questionnaire's user to an admin" do - patch :convert_to_admin, params: { id: @questionnaire } + patch :update, params: { id: @questionnaire, questionnaire: { major: "Human Centered Computing" } } assert_response :redirect assert_redirected_to new_user_session_path end @@ -83,7 +71,7 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user end @@ -111,12 +99,6 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase assert_redirected_to root_path end - should "not allow access to manage_questionnaires#message_events" do - get :message_events, params: { id: @questionnaire } - assert_response :redirect - assert_redirected_to root_path - end - should "not allow access to manage_questionnaires#edit" do get :edit, params: { id: @questionnaire } assert_response :redirect @@ -124,19 +106,13 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase end should "not allow access to manage_questionnaires#create" do - post :create, params: { questionnaire: { first_name: "New" } } + post :create, params: { questionnaire: { major: "Best Major" } } assert_response :redirect assert_redirected_to root_path end should "not allow access to manage_questionnaires#update" do - patch :update, params: { id: @questionnaire, questionnaire: { first_name: "New" } } - assert_response :redirect - assert_redirected_to root_path - end - - should "not allow convert questionnaire's user to an admin" do - patch :convert_to_admin, params: { id: @questionnaire } + patch :update, params: { id: @questionnaire, questionnaire: { major: "Best Major" } } assert_response :redirect assert_redirected_to root_path end @@ -160,10 +136,10 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -182,11 +158,6 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase assert_response :success end - should "allow access to manage_questionnaires#message_events" do - get :message_events, params: { id: @questionnaire } - assert_response :success - end - should "not allow access to manage_questionnaires#new" do get :new, params: { id: @questionnaire } assert_response :redirect @@ -200,19 +171,77 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase end should "not allow access to manage_questionnaires#create" do - post :create, params: { questionnaire: { first_name: "New" } } + post :create, params: { questionnaire: { major: "Best Major" } } assert_response :redirect assert_redirected_to manage_questionnaires_path end should "not allow access to manage_questionnaires#update" do - patch :update, params: { id: @questionnaire, questionnaire: { first_name: "New" } } + patch :update, params: { id: @questionnaire, questionnaire: { major: "Best Major" } } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not allow access to manage_questionnaires#destroy" do + patch :destroy, params: { id: @questionnaire } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not access to manage_questionnaires#update_acc_status" do + patch :update_acc_status, params: { id: @questionnaire, questionnaire: { acc_status: "accepted" } } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "allow access to manage_questionnaires#bulk_apply" do + patch :bulk_apply, params: { bulk_action: "waitlist", bulk_ids: [@questionnaire.id] } + assert_response :success + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to manage_questionnaires#index" do + get :index + assert_response :success + end + + should "allow access to manage_questionnaires datatables api" do + post :datatable, format: :json, params: { "columns[0][data]" => "" } + assert_response :success + end + + should "allow access to manage_questionnaires#show" do + get :show, params: { id: @questionnaire } + assert_response :success + end + + should "not allow access to manage_questionnaires#new" do + get :new, params: { id: @questionnaire } assert_response :redirect assert_redirected_to manage_questionnaires_path end - should "not allow convert questionnaire's user to an admin" do - patch :convert_to_admin, params: { id: @questionnaire } + should "not allow access to manage_questionnaires#edit" do + get :edit, params: { id: @questionnaire } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not allow access to manage_questionnaires#create" do + post :create, params: { questionnaire: { major: "Best Major" } } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not allow access to manage_questionnaires#update" do + patch :update, params: { id: @questionnaire, questionnaire: { major: "Best Major" } } assert_response :redirect assert_redirected_to manage_questionnaires_path end @@ -235,10 +264,10 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -257,60 +286,56 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase assert_response :success end - should "allow access to manage_questionnaires#message_events" do - get :message_events, params: { id: @questionnaire } - assert_response :success - end - should "allow access to manage_questionnaires#edit" do get :edit, params: { id: @questionnaire } assert_response :success end - should "create questionnaire and user" do - assert_difference("User.count", 1) do - assert_difference("Questionnaire.count", 1) do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @questionnaire.school_id, email: "test@example.com", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", gender: @questionnaire.gender, major: @questionnaire.major, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } - end - end - - assert_equal "test@example.com", assigns(:questionnaire).email - assert_redirected_to manage_questionnaire_path(assigns(:questionnaire)) - end - should "not create a duplicate questionnaire for a user" do user = create(:user, email: "existing@example.com") create(:questionnaire, user_id: user.id) assert_difference("User.count", 0) do assert_difference("Questionnaire.count", 0) do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @questionnaire.school_id, email: "existing@example.com", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", gender: @questionnaire.gender, major: @questionnaire.major, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } + post :create, params: { + questionnaire: { + experience: @questionnaire.experience, + interest: @questionnaire.interest, + first_name: @questionnaire.user.first_name, + last_name: @questionnaire.user.last_name, + phone: @questionnaire.phone, + level_of_study: @questionnaire.level_of_study, + date_of_birth: @questionnaire.date_of_birth, + shirt_size: @questionnaire.shirt_size, + school_id: @questionnaire.school_id, + email: "existing@example.com", + agreement_accepted: "1", + code_of_conduct_accepted: "1", + data_sharing_accepted: "1", + gender: @questionnaire.gender, + major: @questionnaire.major, + why_attend: @questionnaire.why_attend, + graduation_year: @questionnaire.graduation_year, + race_ethnicity: @questionnaire.race_ethnicity + } + } end end assert_response :success end - should "create a questionnaire with existing user" do - create(:user, email: "existing@example.com") - assert_difference("User.count", 0) do - assert_difference("Questionnaire.count", 1) do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @questionnaire.school_id, email: "existing@example.com", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", gender: @questionnaire.gender, major: @questionnaire.major, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } - end - end - assert_equal "existing@example.com", assigns(:questionnaire).email - assert_redirected_to manage_questionnaire_path(assigns(:questionnaire)) - end - - should "create school if doesn't exist in questionnaire" do - assert_difference("Questionnaire.count", 1) do - assert_difference("School.count", 1) do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: "My New School", email: "taken@example.com", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", gender: @questionnaire.gender, major: @questionnaire.major, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } - end - end - assert_equal "My New School", assigns(:questionnaire).school.name - end - - should "update questionnaire" do - patch :update, params: { id: @questionnaire, questionnaire: { first_name: "New" } } + # This and email are seaparte as they are still implemented separately. + should "update questionnaire's user's first and last name" do + patch :update, params: { + id: @questionnaire, + questionnaire: { + user: { + "first_name": "firstnametest", + "last_name": "lastnametest" + } + } + } + assert_equal "firstnametest", assigns(:questionnaire).user.first_name + assert_equal "lastnametest", assigns(:questionnaire).user.last_name assert_redirected_to manage_questionnaire_path(assigns(:questionnaire)) end @@ -320,20 +345,21 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase assert_redirected_to manage_questionnaire_path(assigns(:questionnaire)) end - should "convert questionnaire's user to an admin" do - patch :convert_to_admin, params: { id: @questionnaire } - assert assigns(:questionnaire).user.admin? - assert_nil assigns(:questionnaire).user.reload.questionnaire - assert_redirected_to edit_manage_admin_path(assigns(:questionnaire).user) - end + context "destroy questionnaire" do + should "if bus captain, notify directors that bus captain has been removed" do + @user = create(:director) + @questionnaire.update_attribute(:is_bus_captain, true) + assert_difference('enqueued_jobs.size', User.where(role: :director).size) do + delete :destroy, params: { id: @questionnaire } + end + end - should "destroy questionnaire" do - assert_difference("Questionnaire.count", -1) do - assert_difference("User.count", -1) do + should "user destroy questionnaire" do + assert_difference('Questionnaire.count', -1) do delete :destroy, params: { id: @questionnaire } end + assert_redirected_to manage_questionnaires_path end - assert_redirected_to manage_questionnaires_path end should "check in the questionnaire" do @@ -349,13 +375,22 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase @questionnaire.update_attribute(:agreement_accepted, false) @questionnaire.update_attribute(:can_share_info, false) @questionnaire.update_attribute(:phone, "") - patch :check_in, params: { id: @questionnaire, check_in: "true", questionnaire: { agreement_accepted: 1, can_share_info: 1, phone: "(123) 333-3333", email: "new_email@example.com" } } + patch :check_in, params: { + id: @questionnaire, + check_in: "true", + questionnaire: { + agreement_accepted: 1, + can_share_info: 1, + phone: "(123) 333-3333", + email: "new_email@example.com" + } + } @questionnaire.reload assert 1.minute.ago < @questionnaire.checked_in_at assert_equal @user.id, @questionnaire.checked_in_by_id assert_equal true, @questionnaire.agreement_accepted assert_equal true, @questionnaire.can_share_info - assert_equal "(123) 333-3333", @questionnaire.phone + assert_equal "1233333333", @questionnaire.phone assert_equal "new_email@example.com", @questionnaire.email assert_match /Checked in/, flash[:notice] assert_response :redirect @@ -369,7 +404,16 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase @questionnaire.user.update_attribute(:email, "old_email@example.com") @questionnaire.update_attribute(:checked_in_at, nil) @questionnaire.update_attribute(:checked_in_by_id, nil) - patch :check_in, params: { id: @questionnaire, check_in: "", questionnaire: { agreement_accepted: 1, can_share_info: 1, phone: "(123) 333-3333", email: "new_email@example.com" } } + patch :check_in, params: { + id: @questionnaire, + check_in: "", + questionnaire: { + agreement_accepted: 1, + can_share_info: 1, + phone: "(123) 333-3333", + email: "new_email@example.com" + } + } @questionnaire.reload assert_nil @questionnaire.checked_in_at assert_nil @questionnaire.checked_in_by_id diff --git a/test/controllers/manage/schools_controller_test.rb b/test/controllers/manage/schools_controller_test.rb index 6402b80ce..a19f9406d 100644 --- a/test/controllers/manage/schools_controller_test.rb +++ b/test/controllers/manage/schools_controller_test.rb @@ -134,10 +134,75 @@ class Manage::SchoolsControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to manage_schools#index" do + get :index + assert_response :success + end + + should "allow access to manage_schools datatables api" do + post :datatable, format: :json, params: { "columns[0][data]" => "" } + assert_response :success + end + + should "allow access to manage_schools#show" do + get :show, params: { id: @school } + assert_response :success + end + + should "not allow access to manage_schools#new" do + get :new + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#edit" do + get :edit, params: { id: @school } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#create" do + post :create, params: { school: { name: "My Test School" } } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#update" do + patch :update, params: { id: @school, school: { name: "My Test School" } } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#destroy" do + patch :destroy, params: { id: @school } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#merge" do + patch :merge, params: { id: @school } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#perform_merge" do + patch :perform_merge, params: { id: @school, school: { id: "My Test School" } } + assert_response :redirect + assert_redirected_to manage_schools_path + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -199,9 +264,9 @@ class Manage::SchoolsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) + @user = create(:director) @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/stats_controller_test.rb b/test/controllers/manage/stats_controller_test.rb index 791e2cf73..79aa2c9cb 100644 --- a/test/controllers/manage/stats_controller_test.rb +++ b/test/controllers/manage/stats_controller_test.rb @@ -20,7 +20,7 @@ class Manage::StatsControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -39,14 +39,61 @@ class Manage::StatsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end - should "allow access to manage_dashboard#index" do + should "not allow access to stats#index" do + get :index + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to data endpoints" do + paths.each do |path| + patch path + assert_response :redirect + assert_redirected_to manage_checkins_path + end + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to stats#index" do + get :index + assert_response :success + end + + should "allow access to all data endpoints" do + school = create(:school) + Questionnaire::POSSIBLE_ACC_STATUS.each do |status, _name| + create_list(:questionnaire, 5, school_id: school.id, acc_status: status, dietary_restrictions: "Vegetarian", special_needs: "Something") + end + + paths.each do |path| + patch path + assert_response :success + end + end + end + + context "while authenticated as a director" do + setup do + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to stats#index" do get :index assert_response :success end @@ -67,6 +114,6 @@ class Manage::StatsControllerTest < ActionController::TestCase private def paths - [:dietary_special_needs, :sponsor_info, :alt_travel, :mlh_info_applied, :mlh_info_checked_in] + [:dietary_restrictions_special_needs_datatable, :attendee_sponsor_info_datatable, :alt_travel_datatable, :mlh_applied_datatable, :mlh_checked_in_datatable] end end diff --git a/test/controllers/manage/trackable_events_controller_test.rb b/test/controllers/manage/trackable_events_controller_test.rb index faf5b4478..67cd2d398 100644 --- a/test/controllers/manage/trackable_events_controller_test.rb +++ b/test/controllers/manage/trackable_events_controller_test.rb @@ -15,7 +15,7 @@ class Manage::TrackableEventsControllerTest < ActionController::TestCase setup do if do_sign_in @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user @trackable_event.update_attribute(:user, @user) end @@ -52,15 +52,15 @@ class Manage::TrackableEventsControllerTest < ActionController::TestCase end limited_conditions = { - 'event tracking user' => :event_tracking, - 'limited access admin' => :admin_limited_access + 'volunteer' => :volunteer, + 'organizer' => :organizer } limited_conditions.each do |condition_name, user_role| context "while authenticated as a #{condition_name}" do setup do @user = create(:user, role: user_role) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user @trackable_event.update_attribute(:user, @user) end @@ -105,10 +105,10 @@ class Manage::TrackableEventsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/trackable_tags_controller_test.rb b/test/controllers/manage/trackable_tags_controller_test.rb index a392cf371..56c273cfa 100644 --- a/test/controllers/manage/trackable_tags_controller_test.rb +++ b/test/controllers/manage/trackable_tags_controller_test.rb @@ -15,7 +15,7 @@ class Manage::TrackableTagsControllerTest < ActionController::TestCase setup do if do_sign_in @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end end @@ -51,15 +51,15 @@ class Manage::TrackableTagsControllerTest < ActionController::TestCase end limited_conditions = { - 'event tracking user' => :event_tracking, - 'limited access admin' => :admin_limited_access + 'volunteer' => :volunteer, + 'organizer' => :organizer } limited_conditions.each do |condition_name, user_role| context "while authenticated as a #{condition_name}" do setup do @user = create(:user, role: user_role) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -93,10 +93,10 @@ class Manage::TrackableTagsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/admins_controller_test.rb b/test/controllers/manage/users_controller_test.rb similarity index 50% rename from test/controllers/manage/admins_controller_test.rb rename to test/controllers/manage/users_controller_test.rb index 2900a3dd1..2ea0cd3c9 100644 --- a/test/controllers/manage/admins_controller_test.rb +++ b/test/controllers/manage/users_controller_test.rb @@ -1,53 +1,46 @@ require 'test_helper' -class Manage::AdminsControllerTest < ActionController::TestCase +class Manage::UsersControllerTest < ActionController::TestCase setup do @user = create(:user) end context "while not authenticated" do - should "redirect to sign in page on manage_admins#index" do + should "redirect to sign in page on manage_users#index" do get :index assert_response :redirect assert_redirected_to new_user_session_path end - should "not allow access to manage_admins datatables api" do - post :datatable, format: :json, params: { "columns[0][data]" => "" } + should "not allow access to manage_users user datatables api" do + post :user_datatable, format: :json, params: { "columns[0][data]" => "" } assert_response 401 end - should "not allow access to manage_admins#show" do - get :show, params: { id: @user } - assert_response :redirect - assert_redirected_to new_user_session_path + should "not allow access to manage_users staff datatables api" do + post :staff_datatable, format: :json, params: { "columns[0][data]" => "" } + assert_response 401 end - should "not allow access to manage_admins#new" do - get :new, params: { id: @user } + should "not allow access to manage_users#show" do + get :show, params: { id: @user } assert_response :redirect assert_redirected_to new_user_session_path end - should "not allow access to manage_admins#edit" do + should "not allow access to manage_users#edit" do get :edit, params: { id: @user } assert_response :redirect assert_redirected_to new_user_session_path end - should "not allow access to manage_admins#create" do - post :create, params: { user: { email: "test@example.com" } } - assert_response :redirect - assert_redirected_to new_user_session_path - end - - should "not allow access to manage_admins#update" do + should "not allow access to manage_users#update" do patch :update, params: { id: @user, user: { email: "test@example.com" } } assert_response :redirect assert_redirected_to new_user_session_path end - should "not allow access to manage_admins#destroy" do + should "not allow access to manage_users#destroy" do patch :destroy, params: { id: @user } assert_response :redirect assert_redirected_to new_user_session_path @@ -60,116 +53,149 @@ class Manage::AdminsControllerTest < ActionController::TestCase sign_in @user end - should "not allow access to manage_admins#index" do + should "not allow access to manage_users#index" do get :index assert_response :redirect assert_redirected_to root_path end - should "not allow access to manage_admins datatables api" do - post :datatable, format: :json, params: { "columns[0][data]" => "" } + should "not allow access to manage_users users datatables api" do + post :user_datatable, format: :json, params: { "columns[0][data]" => "" } assert_response :redirect assert_redirected_to root_path end - should "not allow access to manage_admins#new" do - get :new, params: { id: @user } + should "not allow access to manage_users staff datatables api" do + post :staff_datatable, format: :json, params: { "columns[0][data]" => "" } assert_response :redirect assert_redirected_to root_path end - should "not allow access to manage_admins#show" do + should "not allow access to manage_users#show" do get :show, params: { id: @user } assert_response :redirect assert_redirected_to root_path end - should "not allow access to manage_admins#edit" do + should "not allow access to manage_users#edit" do get :edit, params: { id: @user } assert_response :redirect assert_redirected_to root_path end - should "not allow access to manage_admins#create" do - post :create, params: { user: { email: "test@example.com" } } - assert_response :redirect - assert_redirected_to root_path - end - - should "not allow access to manage_admins#update" do + should "not allow access to manage_users#update" do patch :update, params: { id: @user, user: { email: "test@example.com" } } assert_response :redirect assert_redirected_to root_path end - should "not allow access to manage_admins#destroy" do + should "not allow access to manage_users#destroy" do patch :destroy, params: { id: @user } assert_response :redirect assert_redirected_to root_path end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end - should "allow access to manage_admins#index" do + should "not allow access to manage_users#index" do get :index - assert_response :success + assert_redirected_to manage_checkins_path end - should "allow access to manage_admins datatables api" do - post :datatable, format: :json, params: { "columns[0][data]" => "" } - assert_response :success + should "not allow access to manage_users users datatables api" do + post :user_datatable, format: :json, params: { "columns[0][data]" => "" } + assert_redirected_to manage_checkins_path end - should "allow access to manage_admins#show" do + should "not allow access to manage_users staff datatables api" do + post :staff_datatable, format: :json, params: { "columns[0][data]" => "" } + assert_redirected_to manage_checkins_path + end + + should "allow access to manage_users#show" do get :show, params: { id: @user } - assert_response :success + assert_redirected_to manage_checkins_path end - should "not allow access to manage_admins#new" do - get :new + should "not allow access to manage_users#edit" do + get :edit, params: { id: @user } assert_response :redirect - assert_redirected_to manage_admins_path + assert_redirected_to manage_users_path end - should "not allow access to manage_admins#edit" do - get :edit, params: { id: @user } + should "not allow access to manage_users#update" do + patch :update, params: { id: @user, user: { email: "test@example.com" } } assert_response :redirect - assert_redirected_to manage_admins_path + assert_redirected_to manage_users_path end - should "not allow access to manage_admins#create" do - post :create, params: { user: { email: "test@example.com" } } + should "not allow access to manage_users#destroy" do + patch :destroy, params: { id: @user } + assert_response :redirect + assert_redirected_to manage_users_path + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "not allow access to manage_users#index" do + get :index + assert_redirected_to manage_root_path + end + + should "not allow access to manage_users users datatables api" do + post :user_datatable, format: :json, params: { "columns[0][data]" => "" } + assert_redirected_to manage_root_path + end + + should "not allow access to manage_users staff datatables api" do + post :staff_datatable, format: :json, params: { "columns[0][data]" => "" } + assert_redirected_to manage_root_path + end + + should "allow access to manage_users#show" do + get :show, params: { id: @user } + assert_redirected_to manage_root_path + end + + should "not allow access to manage_users#edit" do + get :edit, params: { id: @user } assert_response :redirect - assert_redirected_to manage_admins_path + assert_redirected_to manage_users_path end - should "not allow access to manage_admins#update" do + should "not allow access to manage_users#update" do patch :update, params: { id: @user, user: { email: "test@example.com" } } assert_response :redirect - assert_redirected_to manage_admins_path + assert_redirected_to manage_users_path end - should "not allow access to manage_admins#destroy" do + should "not allow access to manage_users#destroy" do patch :destroy, params: { id: @user } assert_response :redirect - assert_redirected_to manage_admins_path + assert_redirected_to manage_users_path end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) + @user = create(:director) @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end - should "allow access to manage_admins#index" do + should "allow access to manage_users#index" do get :index assert_response :success end @@ -179,14 +205,14 @@ class Manage::AdminsControllerTest < ActionController::TestCase # should "create a new admin" do # post :create, params: { user: { email: "test@example.com", role: 'admin' } } # assert_response :redirect - # assert_redirected_to manage_admins_path + # assert_redirected_to manage_users_path # assert assigns(:user).admin?, "new user should be an admin" # end # should "create a new limited access admin" do # post :create, params: { user: { email: "test@example.com", role: 'admin_limited_access' } } # assert_response :redirect - # assert_redirected_to manage_admins_path + # assert_redirected_to manage_users_path # assert !assigns(:user).admin?, "new user should not be an admin" # assert assigns(:user).admin_limited_access?, "new user should be a limited access admin" # end @@ -215,14 +241,14 @@ class Manage::AdminsControllerTest < ActionController::TestCase # should "update user" do # patch :update, params: { id: @user, user: { email: "test@example.coma" } } - # assert_redirected_to manage_admins_path + # assert_redirected_to manage_users_path # end # should "destroy user" do # assert_difference('User.count', -1) do # patch :destroy, params: { id: @user } # end - # assert_redirected_to manage_admins_path + # assert_redirected_to manage_users_path # end end end diff --git a/test/controllers/questionnaires_controller_test.rb b/test/controllers/questionnaires_controller_test.rb index 0ad2c8276..a3f14b404 100644 --- a/test/controllers/questionnaires_controller_test.rb +++ b/test/controllers/questionnaires_controller_test.rb @@ -35,8 +35,8 @@ class QuestionnairesControllerTest < ActionController::TestCase context "while authenticated without a completed questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] - @user = create(:user, email: "newabc@example.com") + @request.env["devise.mapping"] = Devise.mappings[:director] + @user = create(:user) sign_in @user end @@ -47,7 +47,7 @@ class QuestionnairesControllerTest < ActionController::TestCase should "create questionnaire" do assert_difference('Questionnaire.count', 1) do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } + post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } end assert_redirected_to questionnaires_path @@ -60,8 +60,8 @@ class QuestionnairesControllerTest < ActionController::TestCase should "not allow multiple questionnaires" do assert_difference('Questionnaire.count', 1) do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } + post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } + post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } end assert_redirected_to questionnaires_path @@ -71,7 +71,16 @@ class QuestionnairesControllerTest < ActionController::TestCase should "not allow creation" do @questionnaire.delete assert_difference('Questionnaire.count', 0) do - post :create, params: { questionnaire: { first_name: "My first name" } } + post :create, params: { questionnaire: { major: "a great major" } } + end + end + end + + context "with block questionnaires set" do + should "not allow creation" do + HackathonConfig['accepting_questionnaires'] = false + assert_difference('Questionnaire.count', 0) do + post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } end end end @@ -79,13 +88,13 @@ class QuestionnairesControllerTest < ActionController::TestCase context "#school_name" do context "on create" do should "save existing school name" do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: @school.name, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } + post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: @school.name, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } assert_redirected_to questionnaires_path assert_equal 1, School.all.count end should "create a new school when unknown" do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: "New School", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } + post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: "New School", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } assert_redirected_to questionnaires_path assert_equal 2, School.all.count end @@ -94,7 +103,7 @@ class QuestionnairesControllerTest < ActionController::TestCase message = create(:message, type: 'automated', trigger: "questionnaire.pending") assert_difference 'enqueued_jobs.size', 1 do assert_difference 'Questionnaire.count', 1 do - post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: @school.name, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } + post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: @school.name, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } } end end questionnaire = Questionnaire.last @@ -130,7 +139,7 @@ class QuestionnairesControllerTest < ActionController::TestCase context "while authenticated with a completed questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user end @@ -152,23 +161,33 @@ class QuestionnairesControllerTest < ActionController::TestCase end should "update questionnaire" do - patch :update, params: { questionnaire: { first_name: "Foo" } } + patch :update, params: { questionnaire: { major: "Computer Science" } } assert_redirected_to questionnaires_path end - should "destroy questionnaire" do - assert_difference('Questionnaire.count', -1) do - delete :destroy + context "destroy questionnaire" do + should "if bus captain, notify directors that bus captain has been removed" do + @director = create(:director) + @questionnaire.update_attribute(:is_bus_captain, true) + assert_difference('enqueued_jobs.size', User.where(role: :director).size) do + delete :destroy + end end - assert_redirected_to questionnaires_path + should "user destroy questionnaire" do + assert_difference('Questionnaire.count', -1) do + delete :destroy + end + + assert_redirected_to questionnaires_path + end end context "with invalid questionnaire params" do should "not allow updates" do - saved_first_name = @questionnaire.first_name - patch :update, params: { questionnaire: { first_name: "" } } - assert_equal saved_first_name, @questionnaire.reload.first_name + saved_major = @questionnaire.major + patch :update, params: { questionnaire: { major: "" } } + assert_equal saved_major, @questionnaire.reload.major end end diff --git a/test/controllers/rsvps_controller_test.rb b/test/controllers/rsvps_controller_test.rb index d1f95fc68..7a61408a5 100644 --- a/test/controllers/rsvps_controller_test.rb +++ b/test/controllers/rsvps_controller_test.rb @@ -32,7 +32,7 @@ class RsvpsControllerTest < ActionController::TestCase context "while authenticated without a questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] @user = create(:user, email: "newabc@example.com") sign_in @user end @@ -60,7 +60,7 @@ class RsvpsControllerTest < ActionController::TestCase context "while authenticated with a non-accepted questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user @questionnaire.acc_status = "denied" end @@ -90,7 +90,7 @@ class RsvpsControllerTest < ActionController::TestCase setup do clear_enqueued_jobs - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user @questionnaire.update_attribute(:acc_status, "accepted") end @@ -230,7 +230,7 @@ class RsvpsControllerTest < ActionController::TestCase should "not allow updates to invalid questionnaire via rsvp page" do @questionnaire.update_attribute(:phone, "1111111111") - @questionnaire.update_attribute(:first_name, "") + @questionnaire.update_attribute(:agreement_accepted, false) patch :update, params: { questionnaire: { phone: "1234567890" } } assert_not_nil flash[:alert] assert_equal "1111111111", @questionnaire.reload.phone @@ -243,5 +243,38 @@ class RsvpsControllerTest < ActionController::TestCase assert_match /select a RSVP status/, flash[:alert] assert_redirected_to rsvp_path end + + should "if bus captain leaves a bus, notify directors that bus captain has been removed" do + @director = create(:director) + @questionnaire.update_attribute(:is_bus_captain, true) + @questionnaire.update_attribute(:acc_status, "rsvp_confirmed") + + bus_list1 = create(:bus_list, capacity: 1) + bus_list2 = create(:bus_list, capacity: 2) + patch :update, params: { + questionnaire: { + acc_status: "rsvp_confirmed", + phone: "(123) 456-7890", + bus_list_id: bus_list1.id + } + } + + assert_difference('enqueued_jobs.size', User.where(role: :director).size) do + patch :update, params: { + questionnaire: { + acc_status: "rsvp_confirmed", + phone: "(123) 456-7890", + bus_list_id: bus_list2.id + } + } + end + end + + should "not queue bus_captain_left email if questionnaire is not a bus captain" do + @questionnaire.update_attribute(:is_bus_captain, false) + assert_difference('enqueued_jobs.size', 0) do + patch :update, params: { questionnaire: { acc_status: "rsvp_confirmed" } } + end + end end end diff --git a/test/controllers/admin_mailer_test.rb b/test/controllers/staff_mailer_test.rb similarity index 68% rename from test/controllers/admin_mailer_test.rb rename to test/controllers/staff_mailer_test.rb index 565b63158..591b4089d 100644 --- a/test/controllers/admin_mailer_test.rb +++ b/test/controllers/staff_mailer_test.rb @@ -1,6 +1,6 @@ require "test_helper" -class AdminMailerTest < ActionMailer::TestCase +class StaffMailerTest < ActionMailer::TestCase context "weekly_report" do setup do @user = create(:user, email: "test@example.com", receive_weekly_report: true) @@ -10,7 +10,7 @@ class AdminMailerTest < ActionMailer::TestCase end should "deliver weekly email report" do - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_equal ["test@example.com"], email.to assert_equal "Your Weekly Report", email.subject @@ -19,25 +19,25 @@ class AdminMailerTest < ActionMailer::TestCase should "not send when more than 7 days after event started" do HackathonConfig["event_start_date"] = 10.days.ago.to_s - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_nil email end - should "not send if admin is inactive" do + should "not send if staff member is inactive" do @user.update_attribute(:is_active, false) - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_nil email end - should "not send if admin isn't receiving weekly reports" do + should "not send if staff member isn't receiving weekly reports" do @user.update_attribute(:receive_weekly_report, false) - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_nil email end should "not send if there hasn't been new activity" do @questionnaire.update_attribute(:created_at, Date.today) - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_nil email end end diff --git a/test/controllers/user_mailer_test.rb b/test/controllers/user_mailer_test.rb index 5b9d237e4..8bdaeea91 100644 --- a/test/controllers/user_mailer_test.rb +++ b/test/controllers/user_mailer_test.rb @@ -29,6 +29,19 @@ class UserMailerTest < ActionMailer::TestCase end end + context "upon scheduled rsvp reminder email" do + setup do + @user = create(:user, email: "test@example.com") + @message = create(:message, subject: "Are you coming to HackFoo?", type: "automated", trigger: "questionnaire.rsvp_reminder_email") + + should "queue reminder bulk message" do + assert_difference "enqueued_jobs.size", 1 do + UserMailer.rsvp_reminder_email(@user.id).deliver_later + end + end + end + end + context "with customized HackathonConfig" do setup do @user = create(:user, email: "test@example.com") diff --git a/test/factories/questionnaire.rb b/test/factories/questionnaire.rb index 1498ca792..f732b8992 100644 --- a/test/factories/questionnaire.rb +++ b/test/factories/questionnaire.rb @@ -1,7 +1,5 @@ FactoryBot.define do factory :questionnaire do - first_name { "John" } - last_name { "Doe" } phone { "(123) 456-7890" } international { false } date_of_birth { Date.today - 20.years } diff --git a/test/factories/users.rb b/test/factories/users.rb index 6188b9991..4b5f80572 100644 --- a/test/factories/users.rb +++ b/test/factories/users.rb @@ -1,5 +1,7 @@ FactoryBot.define do factory :user do + first_name { "John" } + last_name { "Doe" } sequence :email do |n| "foo#{n}@example.com" end @@ -8,18 +10,25 @@ is_active { true } receive_weekly_report { false } - factory :admin do + factory :director do sequence :email do |n| - "admin#{n}@example.com" + "director#{n}@example.com" end - role { :admin } + role { :director } end - factory :limited_access_admin do + factory :organizer do sequence :email do |n| - "limited_admin#{n}@example.com" + "organizer#{n}@example.com" end - role { :admin_limited_access } + role { :organizer } + end + + factory :volunteer do + sequence :email do |n| + "volunteer#{n}@example.com" + end + role { :volunteer } end end end diff --git a/test/helpers/audit_helper_test.rb b/test/helpers/audit_helper_test.rb index 26c780b0f..7b1d22ff4 100644 --- a/test/helpers/audit_helper_test.rb +++ b/test/helpers/audit_helper_test.rb @@ -17,8 +17,8 @@ class AuditHelperTest < ActiveSupport::TestCase should "model values for related fields" do bus_list = create(:bus_list, name: "Foo bus list") assert_equal "Foo bus list", display_audit_value(bus_list.id, "bus_list_id") - user = create(:user, email: "abc@example.com") - assert_equal "abc@example.com", display_audit_value(user.id, "checked_in_by_id") + user = create(:user, first_name: "Tom", last_name: "Nook") + assert_equal "Tom Nook", display_audit_value(user.id, "checked_in_by_id") end should "use human description for arrays" do diff --git a/test/integration/user_flows_test.rb b/test/integration/user_flows_test.rb index b7bdb9554..f8ca5767d 100644 --- a/test/integration/user_flows_test.rb +++ b/test/integration/user_flows_test.rb @@ -10,9 +10,9 @@ class UserFlowsTest < ActionDispatch::IntegrationTest assert assigns(:questionnaire) end - should "be able to login and browse site as an admin" do - login(FactoryBot.create(:admin)) - assert_redirected_to manage_root_path + should "be able to login and browse site as a director" do + login(FactoryBot.create(:director)) + assert_redirected_to new_questionnaires_path get manage_dashboard_index_path assert_response :success @@ -24,7 +24,7 @@ class UserFlowsTest < ActionDispatch::IntegrationTest get manage_questionnaires_path assert_response :redirect - login(FactoryBot.create(:admin)) + login(FactoryBot.create(:director)) assert_redirected_to manage_questionnaires_path end diff --git a/test/jobs/admin_weekly_report_job_test.rb b/test/jobs/staff_weekly_report_job_test.rb similarity index 74% rename from test/jobs/admin_weekly_report_job_test.rb rename to test/jobs/staff_weekly_report_job_test.rb index c8b6007ba..094fd4403 100644 --- a/test/jobs/admin_weekly_report_job_test.rb +++ b/test/jobs/staff_weekly_report_job_test.rb @@ -1,11 +1,11 @@ require "test_helper" -class AdminWeeklyReportJobTest < ActiveJob::TestCase +class StaffWeeklyReportJobTest < ActiveJob::TestCase should "queue a mailer per recipient" do create_list(:user, 3, receive_weekly_report: true) create_list(:user, 2, receive_weekly_report: false) assert_difference "enqueued_jobs.size", 3 do - worker = AdminWeeklyReportJob.new + worker = StaffWeeklyReportJob.new worker.perform end end diff --git a/test/models/message_test.rb b/test/models/message_test.rb index 9cf56e30c..5476f3ed4 100644 --- a/test/models/message_test.rb +++ b/test/models/message_test.rb @@ -40,9 +40,9 @@ class MessageTest < ActiveSupport::TestCase end should "parse template variables with real values" do - questionnaire = create(:questionnaire, first_name: 'Richard') + user = create(:user, first_name: 'Richard') message = build(:message, body: "Hello, {{first_name}}!") - assert_equal "Hello, Richard!", message.parsed_body(user_id: questionnaire.user_id) + assert_equal "Hello, Richard!", message.parsed_body(user_id: user.id) end should "ignore unknown variables" do diff --git a/test/models/questionnaire_test.rb b/test/models/questionnaire_test.rb index e89c026f8..c1d0ea6c1 100644 --- a/test/models/questionnaire_test.rb +++ b/test/models/questionnaire_test.rb @@ -9,8 +9,6 @@ class QuestionnaireTest < ActiveSupport::TestCase should validate_uniqueness_of :user_id - should strip_attribute :first_name - should strip_attribute :last_name should strip_attribute :acc_status should strip_attribute :major should strip_attribute :gender @@ -19,8 +17,6 @@ class QuestionnaireTest < ActiveSupport::TestCase should strip_attribute :travel_location should strip_attribute :why_attend - should validate_presence_of :first_name - should validate_presence_of :last_name should validate_presence_of :date_of_birth should validate_presence_of :experience should validate_presence_of :interest @@ -163,13 +159,6 @@ class QuestionnaireTest < ActiveSupport::TestCase end end - context "#full_name" do - should "concatenate first and last name" do - questionnaire = create(:questionnaire, first_name: "Foo", last_name: "Bar") - assert_equal "Foo Bar", questionnaire.full_name - end - end - context "#full_location" do should "concatenate city and state with a comma" do school = create(:school, city: "Foo", state: "AZ") @@ -205,16 +194,16 @@ class QuestionnaireTest < ActiveSupport::TestCase end should "return nil if author deleted" do - user = create(:user, email: "admin@example.com") + user = create(:user, email: "director@example.com") questionnaire = create(:questionnaire, acc_status_author_id: user.id) user.destroy assert_nil questionnaire.acc_status_author end should "return the questionnaire's user" do - user = create(:user, email: "admin@example.com") + user = create(:user, email: "director@example.com") questionnaire = create(:questionnaire, acc_status_author_id: user.id) - assert_equal "admin@example.com", questionnaire.acc_status_author.email + assert_equal "director@example.com", questionnaire.acc_status_author.email end end @@ -403,13 +392,13 @@ class QuestionnaireTest < ActiveSupport::TestCase end context "#checked_in_by" do - should "return no one if not checked in" do + should "return nil if not checked in" do questionnaire = create(:questionnaire) assert_nil questionnaire.checked_in_by assert_nil questionnaire.checked_in_by_id end - should "return no one if user who checked-in questionnaire is deleted" do + should "return nil if user who checked-in questionnaire is deleted" do user = create(:user) questionnaire = create(:questionnaire, checked_in_by_id: user.id) user.destroy @@ -477,7 +466,7 @@ class QuestionnaireTest < ActiveSupport::TestCase questionnaire = create(:questionnaire, acc_status: 'accepted') create(:message, trigger: "questionnaire.accepted") assert_difference "enqueued_jobs.size", 0 do - questionnaire.update_attribute(:first_name, "foo bar baz") + questionnaire.update_attribute(:interest, "code") end end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 610a162d1..2bac1093b 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -3,10 +3,14 @@ class UserTest < ActiveSupport::TestCase include ActiveJob::TestHelper + should strip_attribute :first_name + should strip_attribute :last_name should strip_attribute :email should validate_uniqueness_of :email + should validate_presence_of :first_name + should validate_presence_of :last_name should validate_presence_of :email should validate_presence_of :password @@ -18,39 +22,10 @@ class UserTest < ActiveSupport::TestCase should allow_value("test@example.com").for(:email) should_not allow_value("abcd").for(:email) - context "first_name" do - should "return first name when questionnaire exists" do - questionnaire = create(:questionnaire, first_name: "Alpha") - assert_equal "Alpha", questionnaire.user.first_name - end - - should "return blank when no questionnaire exists" do - user = create(:user) - assert_equal "", user.first_name - end - end - - context "last_name" do - should "return last name when questionnaire exists" do - questionnaire = create(:questionnaire, last_name: "Beta") - assert_equal "Beta", questionnaire.user.last_name - end - - should "return blank when no questionnaire exists" do - user = create(:user) - assert_equal "", user.last_name - end - end - context "full_name" do - should "return full name when questionnaire exists" do - questionnaire = create(:questionnaire, first_name: "Alpha", last_name: "Beta") - assert_equal "Alpha Beta", questionnaire.user.full_name - end - - should "return email when no questionnaire exists" do - user = create(:user, email: "foo@example.com") - assert_equal "foo@example.com", user.full_name + should "concatenate first and last name" do + user = create(:user) + assert_equal "John Doe", user.full_name end end @@ -89,11 +64,11 @@ class UserTest < ActiveSupport::TestCase assert_equal 2, User.without_questionnaire.count end - should "not return admins" do + should "not return staff" do create(:questionnaire) # user, has questionnaire - create(:user, role: :event_tracking) # user, does not - create(:user, role: :admin_limited_access) # admin, does not - create(:user, role: :admin) # admin, does not + create(:user, role: :volunteer) # volunteer, does not + create(:user, role: :organizer) # organizer, does not + create(:user, role: :director) # director, does not assert_equal 4, User.count assert_equal 1, User.without_questionnaire.count end @@ -105,6 +80,50 @@ class UserTest < ActiveSupport::TestCase end end + context "current_user is staff" do + should "not report user as staff" do + user = create(:user, role: user) + assert_equal false, user.staff? + end + + should "report volunteer as staff" do + user = create(:user, role: :volunteer) + assert_equal true, user.staff? + end + + should "report organizer as staff" do + user = create(:user, role: :organizer) + assert_equal true, user.staff? + end + + should "report director as staff" do + user = create(:user, role: :director) + assert_equal true, user.staff? + end + end + + context "current_user is organizing staff" do + should "not report user as organizing staff" do + user = create(:user, role: user) + assert_equal false, user.organizing_staff? + end + + should "not report volunteer as organizing staff" do + user = create(:user, role: :volunteer) + assert_equal false, user.organizing_staff? + end + + should "report organizer as organizing staff" do + user = create(:user, role: :organizer) + assert_equal true, user.organizing_staff? + end + + should "report director as organizing staff" do + user = create(:user, role: :director) + assert_equal true, user.organizing_staff? + end + end + context "safe_receive_weekly_report" do should "return false if user is inactive" do user = build(:user, is_active: true, receive_weekly_report: true) diff --git a/vendor/cache/actioncable-5.2.4.4.gem b/vendor/cache/actioncable-5.2.4.4.gem new file mode 100644 index 000000000..2080033d8 Binary files /dev/null and b/vendor/cache/actioncable-5.2.4.4.gem differ diff --git a/vendor/cache/actionmailer-5.2.4.4.gem b/vendor/cache/actionmailer-5.2.4.4.gem new file mode 100644 index 000000000..af1f5c512 Binary files /dev/null and b/vendor/cache/actionmailer-5.2.4.4.gem differ diff --git a/vendor/cache/actionpack-5.2.4.4.gem b/vendor/cache/actionpack-5.2.4.4.gem new file mode 100644 index 000000000..296ed5f42 Binary files /dev/null and b/vendor/cache/actionpack-5.2.4.4.gem differ diff --git a/vendor/cache/actionview-5.2.4.4.gem b/vendor/cache/actionview-5.2.4.4.gem new file mode 100644 index 000000000..3a8d0791c Binary files /dev/null and b/vendor/cache/actionview-5.2.4.4.gem differ diff --git a/vendor/cache/activejob-5.2.4.4.gem b/vendor/cache/activejob-5.2.4.4.gem new file mode 100644 index 000000000..e076f42a8 Binary files /dev/null and b/vendor/cache/activejob-5.2.4.4.gem differ diff --git a/vendor/cache/activemodel-5.2.4.4.gem b/vendor/cache/activemodel-5.2.4.4.gem new file mode 100644 index 000000000..53e230c84 Binary files /dev/null and b/vendor/cache/activemodel-5.2.4.4.gem differ diff --git a/vendor/cache/activerecord-5.2.4.4.gem b/vendor/cache/activerecord-5.2.4.4.gem new file mode 100644 index 000000000..48830512b Binary files /dev/null and b/vendor/cache/activerecord-5.2.4.4.gem differ diff --git a/vendor/cache/activestorage-5.2.4.4.gem b/vendor/cache/activestorage-5.2.4.4.gem new file mode 100644 index 000000000..a9d79dfdb Binary files /dev/null and b/vendor/cache/activestorage-5.2.4.4.gem differ diff --git a/vendor/cache/activesupport-5.2.4.4.gem b/vendor/cache/activesupport-5.2.4.4.gem new file mode 100644 index 000000000..3df172640 Binary files /dev/null and b/vendor/cache/activesupport-5.2.4.4.gem differ diff --git a/vendor/cache/autoprefixer-rails-9.7.6.gem b/vendor/cache/autoprefixer-rails-9.7.6.gem deleted file mode 100644 index b357943d9..000000000 Binary files a/vendor/cache/autoprefixer-rails-9.7.6.gem and /dev/null differ diff --git a/vendor/cache/autoprefixer-rails-9.8.4.gem b/vendor/cache/autoprefixer-rails-9.8.4.gem new file mode 100644 index 000000000..0f9451510 Binary files /dev/null and b/vendor/cache/autoprefixer-rails-9.8.4.gem differ diff --git a/vendor/cache/aws-partitions-1.336.0.gem b/vendor/cache/aws-partitions-1.336.0.gem new file mode 100644 index 000000000..9ac3d9f85 Binary files /dev/null and b/vendor/cache/aws-partitions-1.336.0.gem differ diff --git a/vendor/cache/aws-sdk-core-3.102.1.gem b/vendor/cache/aws-sdk-core-3.102.1.gem new file mode 100644 index 000000000..891dcd639 Binary files /dev/null and b/vendor/cache/aws-sdk-core-3.102.1.gem differ diff --git a/vendor/cache/aws-sdk-kms-1.35.0.gem b/vendor/cache/aws-sdk-kms-1.35.0.gem new file mode 100644 index 000000000..a0ca0381b Binary files /dev/null and b/vendor/cache/aws-sdk-kms-1.35.0.gem differ diff --git a/vendor/cache/aws-sdk-s3-1.72.0.gem b/vendor/cache/aws-sdk-s3-1.72.0.gem new file mode 100644 index 000000000..7e0fc2f5b Binary files /dev/null and b/vendor/cache/aws-sdk-s3-1.72.0.gem differ diff --git a/vendor/cache/aws-sigv4-1.1.3.gem b/vendor/cache/aws-sigv4-1.1.3.gem deleted file mode 100644 index faea98ef7..000000000 Binary files a/vendor/cache/aws-sigv4-1.1.3.gem and /dev/null differ diff --git a/vendor/cache/aws-sigv4-1.2.1.gem b/vendor/cache/aws-sigv4-1.2.1.gem new file mode 100644 index 000000000..0ca808616 Binary files /dev/null and b/vendor/cache/aws-sigv4-1.2.1.gem differ diff --git a/vendor/cache/blazer-2.2.2.gem b/vendor/cache/blazer-2.2.2.gem deleted file mode 100644 index 25c89182f..000000000 Binary files a/vendor/cache/blazer-2.2.2.gem and /dev/null differ diff --git a/vendor/cache/blazer-2.2.5.gem b/vendor/cache/blazer-2.2.5.gem new file mode 100644 index 000000000..af49bda4f Binary files /dev/null and b/vendor/cache/blazer-2.2.5.gem differ diff --git a/vendor/cache/capybara-3.33.0.gem b/vendor/cache/capybara-3.33.0.gem new file mode 100644 index 000000000..a708ba88e Binary files /dev/null and b/vendor/cache/capybara-3.33.0.gem differ diff --git a/vendor/cache/chartkick-3.3.1.gem b/vendor/cache/chartkick-3.3.1.gem deleted file mode 100644 index 40aba6b28..000000000 Binary files a/vendor/cache/chartkick-3.3.1.gem and /dev/null differ diff --git a/vendor/cache/chartkick-3.4.0.gem b/vendor/cache/chartkick-3.4.0.gem new file mode 100644 index 000000000..e359fd01b Binary files /dev/null and b/vendor/cache/chartkick-3.4.0.gem differ diff --git a/vendor/cache/coderay-1.1.2.gem b/vendor/cache/coderay-1.1.2.gem deleted file mode 100644 index 5d698f165..000000000 Binary files a/vendor/cache/coderay-1.1.2.gem and /dev/null differ diff --git a/vendor/cache/coderay-1.1.3.gem b/vendor/cache/coderay-1.1.3.gem new file mode 100644 index 000000000..3475820d2 Binary files /dev/null and b/vendor/cache/coderay-1.1.3.gem differ diff --git a/vendor/cache/concurrent-ruby-1.1.6.gem b/vendor/cache/concurrent-ruby-1.1.6.gem deleted file mode 100644 index 74013bb68..000000000 Binary files a/vendor/cache/concurrent-ruby-1.1.6.gem and /dev/null differ diff --git a/vendor/cache/concurrent-ruby-1.1.7.gem b/vendor/cache/concurrent-ruby-1.1.7.gem new file mode 100644 index 000000000..ae9b3702a Binary files /dev/null and b/vendor/cache/concurrent-ruby-1.1.7.gem differ diff --git a/vendor/cache/connection_pool-2.2.2.gem b/vendor/cache/connection_pool-2.2.2.gem deleted file mode 100644 index 00928ca27..000000000 Binary files a/vendor/cache/connection_pool-2.2.2.gem and /dev/null differ diff --git a/vendor/cache/connection_pool-2.2.3.gem b/vendor/cache/connection_pool-2.2.3.gem new file mode 100644 index 000000000..9d89e9d98 Binary files /dev/null and b/vendor/cache/connection_pool-2.2.3.gem differ diff --git a/vendor/cache/devise-4.7.1.gem b/vendor/cache/devise-4.7.1.gem deleted file mode 100644 index da246a685..000000000 Binary files a/vendor/cache/devise-4.7.1.gem and /dev/null differ diff --git a/vendor/cache/devise-4.7.2.gem b/vendor/cache/devise-4.7.2.gem new file mode 100644 index 000000000..e5e0ad58a Binary files /dev/null and b/vendor/cache/devise-4.7.2.gem differ diff --git a/vendor/cache/excon-0.73.0.gem b/vendor/cache/excon-0.73.0.gem deleted file mode 100644 index f64e4f939..000000000 Binary files a/vendor/cache/excon-0.73.0.gem and /dev/null differ diff --git a/vendor/cache/excon-0.75.0.gem b/vendor/cache/excon-0.75.0.gem new file mode 100644 index 000000000..2d2e12341 Binary files /dev/null and b/vendor/cache/excon-0.75.0.gem differ diff --git a/vendor/cache/factory_bot-5.2.0.gem b/vendor/cache/factory_bot-5.2.0.gem deleted file mode 100644 index 258191c32..000000000 Binary files a/vendor/cache/factory_bot-5.2.0.gem and /dev/null differ diff --git a/vendor/cache/factory_bot-6.0.2.gem b/vendor/cache/factory_bot-6.0.2.gem new file mode 100644 index 000000000..012dfcbbe Binary files /dev/null and b/vendor/cache/factory_bot-6.0.2.gem differ diff --git a/vendor/cache/factory_bot_rails-5.2.0.gem b/vendor/cache/factory_bot_rails-5.2.0.gem deleted file mode 100644 index 70cdb82d7..000000000 Binary files a/vendor/cache/factory_bot_rails-5.2.0.gem and /dev/null differ diff --git a/vendor/cache/factory_bot_rails-6.0.0.gem b/vendor/cache/factory_bot_rails-6.0.0.gem new file mode 100644 index 000000000..29470fa3b Binary files /dev/null and b/vendor/cache/factory_bot_rails-6.0.0.gem differ diff --git a/vendor/cache/ffi-1.12.2.gem b/vendor/cache/ffi-1.12.2.gem deleted file mode 100644 index e596b5d3e..000000000 Binary files a/vendor/cache/ffi-1.12.2.gem and /dev/null differ diff --git a/vendor/cache/ffi-1.13.1.gem b/vendor/cache/ffi-1.13.1.gem new file mode 100644 index 000000000..e59187ea1 Binary files /dev/null and b/vendor/cache/ffi-1.13.1.gem differ diff --git a/vendor/cache/fugit-1.3.6.gem b/vendor/cache/fugit-1.3.6.gem new file mode 100644 index 000000000..cad39ae0e Binary files /dev/null and b/vendor/cache/fugit-1.3.6.gem differ diff --git a/vendor/cache/httparty-0.18.0.gem b/vendor/cache/httparty-0.18.0.gem deleted file mode 100644 index 4405c6a82..000000000 Binary files a/vendor/cache/httparty-0.18.0.gem and /dev/null differ diff --git a/vendor/cache/httparty-0.18.1.gem b/vendor/cache/httparty-0.18.1.gem new file mode 100644 index 000000000..cda4bbc30 Binary files /dev/null and b/vendor/cache/httparty-0.18.1.gem differ diff --git a/vendor/cache/i18n-1.8.2.gem b/vendor/cache/i18n-1.8.2.gem deleted file mode 100644 index 4207f798c..000000000 Binary files a/vendor/cache/i18n-1.8.2.gem and /dev/null differ diff --git a/vendor/cache/i18n-1.8.5.gem b/vendor/cache/i18n-1.8.5.gem new file mode 100644 index 000000000..f5c89ea58 Binary files /dev/null and b/vendor/cache/i18n-1.8.5.gem differ diff --git a/vendor/cache/loofah-2.5.0.gem b/vendor/cache/loofah-2.5.0.gem deleted file mode 100644 index cf9c90f04..000000000 Binary files a/vendor/cache/loofah-2.5.0.gem and /dev/null differ diff --git a/vendor/cache/loofah-2.7.0.gem b/vendor/cache/loofah-2.7.0.gem new file mode 100644 index 000000000..13bd5eb16 Binary files /dev/null and b/vendor/cache/loofah-2.7.0.gem differ diff --git a/vendor/cache/lumberjack-1.2.4.gem b/vendor/cache/lumberjack-1.2.4.gem deleted file mode 100644 index e419342b5..000000000 Binary files a/vendor/cache/lumberjack-1.2.4.gem and /dev/null differ diff --git a/vendor/cache/lumberjack-1.2.6.gem b/vendor/cache/lumberjack-1.2.6.gem new file mode 100644 index 000000000..a9d1bf838 Binary files /dev/null and b/vendor/cache/lumberjack-1.2.6.gem differ diff --git a/vendor/cache/minitest-5.14.2.gem b/vendor/cache/minitest-5.14.2.gem new file mode 100644 index 000000000..66232f78f Binary files /dev/null and b/vendor/cache/minitest-5.14.2.gem differ diff --git a/vendor/cache/multi_json-1.14.1.gem b/vendor/cache/multi_json-1.14.1.gem deleted file mode 100644 index 65dea1dca..000000000 Binary files a/vendor/cache/multi_json-1.14.1.gem and /dev/null differ diff --git a/vendor/cache/multi_json-1.15.0.gem b/vendor/cache/multi_json-1.15.0.gem new file mode 100644 index 000000000..8348d7b7d Binary files /dev/null and b/vendor/cache/multi_json-1.15.0.gem differ diff --git a/vendor/cache/nio4r-2.5.2.gem b/vendor/cache/nio4r-2.5.2.gem deleted file mode 100644 index 4500941e6..000000000 Binary files a/vendor/cache/nio4r-2.5.2.gem and /dev/null differ diff --git a/vendor/cache/nio4r-2.5.3.gem b/vendor/cache/nio4r-2.5.3.gem new file mode 100644 index 000000000..9947d76b0 Binary files /dev/null and b/vendor/cache/nio4r-2.5.3.gem differ diff --git a/vendor/cache/nokogiri-1.10.9.gem b/vendor/cache/nokogiri-1.10.10.gem similarity index 89% rename from vendor/cache/nokogiri-1.10.9.gem rename to vendor/cache/nokogiri-1.10.10.gem index 51a0949d3..655364f2b 100644 Binary files a/vendor/cache/nokogiri-1.10.9.gem and b/vendor/cache/nokogiri-1.10.10.gem differ diff --git a/vendor/cache/omniauth-mlh-0.3.1.gem b/vendor/cache/omniauth-mlh-0.3.1.gem deleted file mode 100644 index 5029170d5..000000000 Binary files a/vendor/cache/omniauth-mlh-0.3.1.gem and /dev/null differ diff --git a/vendor/cache/omniauth-mlh-0.4.1.gem b/vendor/cache/omniauth-mlh-0.4.1.gem new file mode 100644 index 000000000..4068af409 Binary files /dev/null and b/vendor/cache/omniauth-mlh-0.4.1.gem differ diff --git a/vendor/cache/puma-4.3.4.gem b/vendor/cache/puma-4.3.4.gem new file mode 100644 index 000000000..422fc484c Binary files /dev/null and b/vendor/cache/puma-4.3.4.gem differ diff --git a/vendor/cache/rails-5.2.4.4.gem b/vendor/cache/rails-5.2.4.4.gem new file mode 100644 index 000000000..3310068a7 Binary files /dev/null and b/vendor/cache/rails-5.2.4.4.gem differ diff --git a/vendor/cache/rails-controller-testing-1.0.4.gem b/vendor/cache/rails-controller-testing-1.0.4.gem deleted file mode 100644 index d73a989d2..000000000 Binary files a/vendor/cache/rails-controller-testing-1.0.4.gem and /dev/null differ diff --git a/vendor/cache/rails-controller-testing-1.0.5.gem b/vendor/cache/rails-controller-testing-1.0.5.gem new file mode 100644 index 000000000..870b8085c Binary files /dev/null and b/vendor/cache/rails-controller-testing-1.0.5.gem differ diff --git a/vendor/cache/railties-5.2.4.4.gem b/vendor/cache/railties-5.2.4.4.gem new file mode 100644 index 000000000..eee027d4d Binary files /dev/null and b/vendor/cache/railties-5.2.4.4.gem differ diff --git a/vendor/cache/redis-4.2.1.gem b/vendor/cache/redis-4.2.1.gem new file mode 100644 index 000000000..9d72f7304 Binary files /dev/null and b/vendor/cache/redis-4.2.1.gem differ diff --git a/vendor/cache/regexp_parser-1.7.0.gem b/vendor/cache/regexp_parser-1.7.0.gem deleted file mode 100644 index e986c59d9..000000000 Binary files a/vendor/cache/regexp_parser-1.7.0.gem and /dev/null differ diff --git a/vendor/cache/regexp_parser-1.7.1.gem b/vendor/cache/regexp_parser-1.7.1.gem new file mode 100644 index 000000000..7b9a3e936 Binary files /dev/null and b/vendor/cache/regexp_parser-1.7.1.gem differ diff --git a/vendor/cache/responders-3.0.0.gem b/vendor/cache/responders-3.0.0.gem deleted file mode 100644 index fae2e7381..000000000 Binary files a/vendor/cache/responders-3.0.0.gem and /dev/null differ diff --git a/vendor/cache/responders-3.0.1.gem b/vendor/cache/responders-3.0.1.gem new file mode 100644 index 000000000..76ae09afd Binary files /dev/null and b/vendor/cache/responders-3.0.1.gem differ diff --git a/vendor/cache/rollbar-2.25.0.gem b/vendor/cache/rollbar-2.25.0.gem deleted file mode 100644 index f51c15231..000000000 Binary files a/vendor/cache/rollbar-2.25.0.gem and /dev/null differ diff --git a/vendor/cache/rollbar-2.26.0.gem b/vendor/cache/rollbar-2.26.0.gem new file mode 100644 index 000000000..f9225b61b Binary files /dev/null and b/vendor/cache/rollbar-2.26.0.gem differ diff --git a/vendor/cache/ruby_http_client-3.5.0.gem b/vendor/cache/ruby_http_client-3.5.0.gem new file mode 100644 index 000000000..99f6b2a3a Binary files /dev/null and b/vendor/cache/ruby_http_client-3.5.0.gem differ diff --git a/vendor/cache/sassc-2.3.0.gem b/vendor/cache/sassc-2.3.0.gem deleted file mode 100644 index 8338c63ef..000000000 Binary files a/vendor/cache/sassc-2.3.0.gem and /dev/null differ diff --git a/vendor/cache/sassc-2.4.0.gem b/vendor/cache/sassc-2.4.0.gem new file mode 100644 index 000000000..a8e2e1f28 Binary files /dev/null and b/vendor/cache/sassc-2.4.0.gem differ diff --git a/vendor/cache/sendgrid-actionmailer-3.0.2.gem b/vendor/cache/sendgrid-actionmailer-3.0.2.gem new file mode 100644 index 000000000..c2ae59736 Binary files /dev/null and b/vendor/cache/sendgrid-actionmailer-3.0.2.gem differ diff --git a/vendor/cache/sendgrid-ruby-6.3.2.gem b/vendor/cache/sendgrid-ruby-6.3.2.gem new file mode 100644 index 000000000..b57c3e4b4 Binary files /dev/null and b/vendor/cache/sendgrid-ruby-6.3.2.gem differ diff --git a/vendor/cache/sexp_processor-4.14.1.gem b/vendor/cache/sexp_processor-4.14.1.gem deleted file mode 100644 index 841002be9..000000000 Binary files a/vendor/cache/sexp_processor-4.14.1.gem and /dev/null differ diff --git a/vendor/cache/sexp_processor-4.15.0.gem b/vendor/cache/sexp_processor-4.15.0.gem new file mode 100644 index 000000000..9b1f9720b Binary files /dev/null and b/vendor/cache/sexp_processor-4.15.0.gem differ diff --git a/vendor/cache/skylight-4.3.0.gem b/vendor/cache/skylight-4.3.0.gem deleted file mode 100644 index e58840083..000000000 Binary files a/vendor/cache/skylight-4.3.0.gem and /dev/null differ diff --git a/vendor/cache/skylight-core-4.3.0.gem b/vendor/cache/skylight-core-4.3.0.gem deleted file mode 100644 index 2d6980dfa..000000000 Binary files a/vendor/cache/skylight-core-4.3.0.gem and /dev/null differ diff --git a/vendor/cache/sparkpost_rails-1.5.2.gem b/vendor/cache/sparkpost_rails-1.5.2.gem deleted file mode 100644 index 79b9d20a4..000000000 Binary files a/vendor/cache/sparkpost_rails-1.5.2.gem and /dev/null differ diff --git a/vendor/cache/sprockets-4.0.0.gem b/vendor/cache/sprockets-4.0.0.gem deleted file mode 100644 index 2edf4f5d5..000000000 Binary files a/vendor/cache/sprockets-4.0.0.gem and /dev/null differ diff --git a/vendor/cache/sprockets-4.0.2.gem b/vendor/cache/sprockets-4.0.2.gem new file mode 100644 index 000000000..94d060f1f Binary files /dev/null and b/vendor/cache/sprockets-4.0.2.gem differ diff --git a/vendor/cache/test-unit-3.3.5.gem b/vendor/cache/test-unit-3.3.5.gem deleted file mode 100644 index 2ccbcc135..000000000 Binary files a/vendor/cache/test-unit-3.3.5.gem and /dev/null differ diff --git a/vendor/cache/test-unit-3.3.6.gem b/vendor/cache/test-unit-3.3.6.gem new file mode 100644 index 000000000..d85273558 Binary files /dev/null and b/vendor/cache/test-unit-3.3.6.gem differ diff --git a/vendor/cache/websocket-driver-0.7.1.gem b/vendor/cache/websocket-driver-0.7.1.gem deleted file mode 100644 index b32e50e9a..000000000 Binary files a/vendor/cache/websocket-driver-0.7.1.gem and /dev/null differ diff --git a/vendor/cache/websocket-driver-0.7.3.gem b/vendor/cache/websocket-driver-0.7.3.gem new file mode 100644 index 000000000..ed3641301 Binary files /dev/null and b/vendor/cache/websocket-driver-0.7.3.gem differ diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 000000000..7a516550e --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,9161 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.4.tgz", + "integrity": "sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.4.tgz", + "integrity": "sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.4.tgz", + "integrity": "sha512-LyacH/kgQPgLAuaWrvvq1+E7f5bLyT8jXCh7nM67sRsy2cpIGfgWJ+FCnAKQXfY+F0tXUaN6FqLkp4JiCzdK8Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz", + "integrity": "sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz", + "integrity": "sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.4", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "dev": true, + "requires": { + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.4.tgz", + "integrity": "sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz", + "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", + "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", + "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz", + "integrity": "sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz", + "integrity": "sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz", + "integrity": "sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz", + "integrity": "sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", + "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", + "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", + "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.4.tgz", + "integrity": "sha512-FTK3eQFrPv2aveerUSazFmGygqIdTtvskG50SnGnbEUnRPcGx2ylBhdFIzoVS1ty44hEgcPoCAyw5r3VDEq+Ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", + "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", + "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz", + "integrity": "sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/polyfill": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.10.4.tgz", + "integrity": "sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg==", + "dev": true, + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/preset-env": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz", + "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.10.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.10.4", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.10.4", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", + "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.10.4", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/plugin-transform-react-jsx-development": "^7.10.4", + "@babel/plugin-transform-react-jsx-self": "^7.10.4", + "@babel/plugin-transform-react-jsx-source": "^7.10.4", + "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + } + }, + "@babel/register": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.4.tgz", + "integrity": "sha512-whHmgGiWNVyTVnYTSawtDWhaeYsc+noeU8Rmi+MPnbGhDYmr5QpEDMrQcIA07D2RUv0BlThPcN89XcHCqq/O4g==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.13", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + } + }, + "@babel/runtime": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.4.tgz", + "integrity": "sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, + "@types/cheerio": { + "version": "0.22.18", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.18.tgz", + "integrity": "sha512-Fq7R3fINAPSdUEhOyjG4iVxgHrOnqDJbY0/BUuiN0pvD/rfmZWekVZnv+vcs8TtpA2XF50uv50LaE4EnpEL/Hw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/node": { + "version": "14.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", + "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "arch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", + "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==", + "dev": true + }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "dev": true, + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=", + "dev": true, + "requires": { + "gulp-header": "^1.7.1" + } + }, + "autoprefixer": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", + "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001087", + "colorette": "^1.2.0", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "bin-build": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dev": true, + "requires": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + } + }, + "bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "executable": "^4.1.0" + } + }, + "bin-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "find-versions": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "bin-version-check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", + "dev": true, + "requires": { + "bin-version": "^3.0.0", + "semver": "^5.6.0", + "semver-truncate": "^1.1.2" + } + }, + "bin-wrapper": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", + "dev": true, + "requires": { + "bin-check": "^4.1.0", + "bin-version-check": "^4.0.0", + "download": "^7.1.0", + "import-lazy": "^3.1.0", + "os-filter-obj": "^2.0.0", + "pify": "^4.0.1" + }, + "dependencies": { + "download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dev": true, + "requires": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "dev": true + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "requires": { + "p-timeout": "^2.0.1" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "dev": true, + "requires": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "dev": true, + "requires": { + "bytes": "1", + "string_decoder": "0.10" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", + "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001088", + "electron-to-chromium": "^1.3.483", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001093", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", + "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "requires": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "clipboard": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", + "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", + "dev": true, + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", + "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crowdin-cli": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/crowdin-cli/-/crowdin-cli-0.3.0.tgz", + "integrity": "sha1-6smYmm/n/qrzMJA5evwYfGe0YZE=", + "dev": true, + "requires": { + "request": "^2.53.0", + "yamljs": "^0.2.1", + "yargs": "^2.3.0" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true, + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68=", + "dev": true + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "docusaurus": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/docusaurus/-/docusaurus-1.14.4.tgz", + "integrity": "sha512-KALmrlZBc0E+AB0ITR4POGKv8WcrcSSxvmgq7nC3TdpS+S2hrlXN/2tV3tVOZ8q8m+zhcMs7l9mAIhGFQyQwIw==", + "dev": true, + "requires": { + "@babel/core": "^7.7.4", + "@babel/plugin-proposal-class-properties": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.4", + "@babel/polyfill": "^7.7.0", + "@babel/preset-env": "^7.7.4", + "@babel/preset-react": "^7.7.4", + "@babel/register": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "autoprefixer": "^9.7.2", + "babylon": "^6.18.0", + "chalk": "^3.0.0", + "classnames": "^2.2.6", + "commander": "^4.0.1", + "crowdin-cli": "^0.3.0", + "cssnano": "^4.1.10", + "escape-string-regexp": "^2.0.0", + "express": "^4.17.1", + "feed": "^4.0.0", + "fs-extra": "^8.1.0", + "gaze": "^1.1.3", + "github-slugger": "^1.2.1", + "glob": "^7.1.6", + "highlight.js": "^9.16.2", + "imagemin": "^6.0.0", + "imagemin-gifsicle": "^6.0.1", + "imagemin-jpegtran": "^6.0.0", + "imagemin-optipng": "^6.0.0", + "imagemin-svgo": "^7.0.0", + "lodash": "^4.17.15", + "markdown-toc": "^1.2.0", + "mkdirp": "^0.5.1", + "portfinder": "^1.0.25", + "postcss": "^7.0.23", + "prismjs": "^1.17.1", + "react": "^16.8.4", + "react-dev-utils": "^9.1.0", + "react-dom": "^16.8.4", + "remarkable": "^2.0.0", + "request": "^2.88.0", + "shelljs": "^0.8.3", + "sitemap": "^3.2.2", + "tcp-port-used": "^1.0.1", + "tiny-lr": "^1.1.1", + "tree-node-cli": "^1.2.5", + "truncate-html": "^1.0.3" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "requires": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.488", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.488.tgz", + "integrity": "sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q==", + "dev": true + }, + "emoji-regex": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", + "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "requires": { + "string-template": "~0.2.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", + "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "exec-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "p-finally": "^1.0.0", + "pify": "^3.0.0", + "rimraf": "^2.5.4", + "tempfile": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "feed": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.0.tgz", + "integrity": "sha512-nLU4Fn+5TCJ1Zu9kBDqXPxsaTXaL/hZgZ3pmT87TUzS1kfaL91iIKJ+DFWygL8CrOeYw80z7QWxabkMV/x+g2g==", + "dev": true, + "requires": { + "xml-js": "^1.6.11" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "requires": { + "npm-conf": "^1.1.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gifsicle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-4.0.1.tgz", + "integrity": "sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "execa": "^1.0.0", + "logalot": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", + "dev": true, + "requires": { + "emoji-regex": ">=6.0.0 <=6.1.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dev": true, + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=", + "dev": true, + "requires": { + "ansi-red": "^0.1.1", + "coffee-script": "^1.12.4", + "extend-shallow": "^2.0.1", + "js-yaml": "^3.8.1", + "toml": "^2.3.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "dev": true, + "requires": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "9.18.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", + "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", + "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "imagemin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz", + "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==", + "dev": true, + "requires": { + "file-type": "^10.7.0", + "globby": "^8.0.1", + "make-dir": "^1.0.0", + "p-pipe": "^1.1.0", + "pify": "^4.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + } + } + }, + "imagemin-gifsicle": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz", + "integrity": "sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng==", + "dev": true, + "requires": { + "exec-buffer": "^3.0.0", + "gifsicle": "^4.0.0", + "is-gif": "^3.0.0" + } + }, + "imagemin-jpegtran": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-6.0.0.tgz", + "integrity": "sha512-Ih+NgThzqYfEWv9t58EItncaaXIHR0u9RuhKa8CtVBlMBvY0dCIxgQJQCfwImA4AV1PMfmUKlkyIHJjb7V4z1g==", + "dev": true, + "requires": { + "exec-buffer": "^3.0.0", + "is-jpg": "^2.0.0", + "jpegtran-bin": "^4.0.0" + } + }, + "imagemin-optipng": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-6.0.0.tgz", + "integrity": "sha512-FoD2sMXvmoNm/zKPOWdhKpWdFdF9qiJmKC17MxZJPH42VMAp17/QENI/lIuP7LCUnLVAloO3AUoTSNzfhpyd8A==", + "dev": true, + "requires": { + "exec-buffer": "^3.0.0", + "is-png": "^1.0.0", + "optipng-bin": "^5.0.0" + } + }, + "imagemin-svgo": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-7.1.0.tgz", + "integrity": "sha512-0JlIZNWP0Luasn1HT82uB9nU9aa+vUj6kpT+MjPW11LbprXC+iC4HDwn1r4Q2/91qj4iy9tRZNsFySMlEpLdpg==", + "dev": true, + "requires": { + "is-svg": "^4.2.1", + "svgo": "^1.3.2" + }, + "dependencies": { + "is-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.2.1.tgz", + "integrity": "sha512-PHx3ANecKsKNl5y5+Jvt53Y4J7MfMpbNZkv384QNiswMKAWIbvcqbPz+sYbFKJI8Xv3be01GSFniPmoaP+Ai5A==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.2" + } + } + } + }, + "immer": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-gif": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz", + "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==", + "dev": true, + "requires": { + "file-type": "^10.4.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-jpg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz", + "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=", + "dev": true + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-png": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", + "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "is2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", + "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^2.1.0", + "is-url": "^1.2.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "jpegtran-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", + "integrity": "sha512-2cRl1ism+wJUoYAYFt6O/rLBfpXNWG2dUWbgcEkTt5WGMnqI46eEro8T4C5zGROxKRqyKpCBSdHPvt5UYCtxaQ==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "extend-shallow": "^2.0.1", + "is-number": "^2.1.0", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", + "dev": true + }, + "lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", + "dev": true + }, + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "logalot": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", + "dev": true, + "requires": { + "figures": "^1.3.5", + "squeak": "^1.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lpad-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88=", + "dev": true + }, + "markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "diacritics-map": "^0.1.0", + "gray-matter": "^2.1.0", + "lazy-cache": "^2.0.2", + "list-item": "^1.1.1", + "markdown-link": "^0.1.1", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "object.pick": "^1.2.0", + "remarkable": "^1.7.1", + "repeat-string": "^1.6.1", + "strip-color": "^0.1.0" + }, + "dependencies": { + "remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "requires": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + } + } + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optipng-bin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz", + "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.0.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "requires": { + "arch": "^2.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", + "dev": true, + "requires": { + "p-timeout": "^1.1.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-pipe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "portfinder": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prismjs": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz", + "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==", + "dev": true, + "requires": { + "clipboard": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dev-utils": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz", + "integrity": "sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.5.5", + "address": "1.1.2", + "browserslist": "4.7.0", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.5.0", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.1.1", + "immer": "1.10.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", + "loader-utils": "1.2.3", + "open": "^6.3.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^6.0.3", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "sockjs-client": "1.4.0", + "strip-ansi": "5.2.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "react-dom": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-error-overlay": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", + "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==", + "dev": true + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "dev": true, + "requires": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + }, + "dependencies": { + "autolinker": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.14.1.tgz", + "integrity": "sha512-yvsRHIaY51EYDml6MGlbqyJGfl4n7zezGYf+R7gvM8c5LNpRGc4SISkvgAswSS8SWxk/OrGCylKV9mJyVstz7w==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", + "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "dev": true, + "requires": { + "commander": "~2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sitemap": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-3.2.2.tgz", + "integrity": "sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg==", + "dev": true, + "requires": { + "lodash.chunk": "^4.2.0", + "lodash.padstart": "^4.6.1", + "whatwg-url": "^7.0.0", + "xmlbuilder": "^13.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dev": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "squeak": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=", + "dev": true + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "requires": { + "is-natural-number": "^4.0.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "tcp-port-used": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz", + "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==", + "dev": true, + "requires": { + "debug": "4.1.0", + "is2": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "dev": true, + "optional": true + }, + "tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "requires": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toml": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "tree-node-cli": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tree-node-cli/-/tree-node-cli-1.3.0.tgz", + "integrity": "sha512-7B5IvFiDQMnBjmxHQ4YMdIqklofqla1mINa/ddlxUHC4seEJHdig19C49NONVHmAom/O9dByGvN0PLReCCqqqQ==", + "dev": true, + "requires": { + "commander": "^5.0.0" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "truncate-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/truncate-html/-/truncate-html-1.0.3.tgz", + "integrity": "sha512-1o1prdRv+iehXcGwn29YgXU17DotHkr+OK3ijVEG7FGMwHNG9RyobXwimw6djDvbIc24rhmz3tjNNvNESjkNkQ==", + "dev": true, + "requires": { + "@types/cheerio": "^0.22.8", + "cheerio": "0.22.0" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dev": true, + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dev": true, + "requires": { + "sax": "^1.2.4" + } + }, + "xmlbuilder": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", + "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yamljs": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.2.10.tgz", + "integrity": "sha1-SBzHwlynOvWfWR8MluPOVsdXpA8=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + } + }, + "yargs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-2.3.0.tgz", + "integrity": "sha1-6QDIclDsXNCA22AJ/j3WMVbx1/s=", + "dev": true, + "requires": { + "wordwrap": "0.0.2" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/website/pages/en/index.js b/website/pages/en/index.js index 62a48d7cd..cfb5dd134 100755 --- a/website/pages/en/index.js +++ b/website/pages/en/index.js @@ -58,7 +58,7 @@ class HomeSplash extends React.Component { - + diff --git a/website/sidebars.json b/website/sidebars.json index 80c51de0a..614eea1c2 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -1,14 +1,18 @@ { "docs": { - "HackathonManager": ["running-a-hackathon", "busses", "questionnaires", "messages"], - "API Usage": ["api"], - "Deployment": [ + "Setup": [ "deployment", - "deployment-dokku", "deployment-heroku", + "deployment-dokku", "deployment-okd", "deployment-environment-variables", "customization" - ] + ], + "Maintenance" : [ + "updating-hm" + ], + "Docs": ["docs-overview", "questionnaires", "messages", "busses"], + "API": ["api-overview", "api-testing-setup"], + "Getting Help": ["resources"] } } diff --git a/website/siteConfig.js b/website/siteConfig.js index f02004ce4..387e1b581 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -48,7 +48,7 @@ const siteConfig = { // For no header links in the top nav bar -> headerLinks: [], headerLinks: [ { doc: 'deployment', label: 'Get Started' }, - { doc: 'running-a-hackathon', label: 'Docs' }, + { doc: 'docs-overview', label: 'Docs' }, { href: 'https://github.com/codeRIT/hackathon-manager', label: 'GitHub' }, ], diff --git a/yarn.lock b/yarn.lock index 8864fc5a6..e6d1024d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,33 +3,26 @@ "@babel/code-frame@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: - "@babel/highlight" "^7.8.3" + "@babel/highlight" "^7.10.4" -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== dependencies: - "@babel/helper-validator-identifier" "^7.9.0" + "@babel/helper-validator-identifier" "^7.10.4" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/runtime@^7.9.2": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" - integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== - dependencies: - regenerator-runtime "^0.13.4" - "@iarna/cli@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-1.2.0.tgz#0f7af5e851afe895104583c4ca07377a8094d641" @@ -61,99 +54,106 @@ fastq "^1.6.0" "@octokit/auth-token@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.0.tgz#b64178975218b99e4dfe948253f0673cbbb59d9f" - integrity sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.2.tgz#10d0ae979b100fa6b72fa0e8e63e27e6d0dbff8a" + integrity sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ== dependencies: - "@octokit/types" "^2.0.0" + "@octokit/types" "^5.0.0" "@octokit/core@^2.4.3": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-2.5.0.tgz#4706258893a7ac6ab35d58d2fb9f2d2ba19a41a5" - integrity sha512-uvzmkemQrBgD8xuGbjhxzJN1darJk9L2cS+M99cHrDG2jlSVpxNJVhoV86cXdYBqdHCc9Z995uLCczaaHIYA6Q== + version "2.5.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-2.5.4.tgz#f7fbf8e4f86c5cc2497a8887ba2561ec8d358054" + integrity sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ== dependencies: "@octokit/auth-token" "^2.4.0" "@octokit/graphql" "^4.3.1" "@octokit/request" "^5.4.0" - "@octokit/types" "^2.0.0" + "@octokit/types" "^5.0.0" before-after-hook "^2.1.0" universal-user-agent "^5.0.0" "@octokit/endpoint@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.1.tgz#16d5c0e7a83e3a644d1ddbe8cded6c3d038d31d7" - integrity sha512-pOPHaSz57SFT/m3R5P8MUu4wLPszokn5pXcB/pzavLTQf2jbU+6iayTvzaY6/BiotuRS0qyEUkx3QglT4U958A== + version "6.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.5.tgz#43a6adee813c5ffd2f719e20cfd14a1fee7c193a" + integrity sha512-70K5u6zd45ItOny6aHQAsea8HHQjlQq85yqOMe+Aj8dkhN2qSJ9T+Q3YjUjEYfPRBcuUWNgMn62DQnP/4LAIiQ== dependencies: - "@octokit/types" "^2.11.1" - is-plain-object "^3.0.0" - universal-user-agent "^5.0.0" + "@octokit/types" "^5.0.0" + is-plain-object "^4.0.0" + universal-user-agent "^6.0.0" "@octokit/graphql@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.3.1.tgz#9ee840e04ed2906c7d6763807632de84cdecf418" - integrity sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA== + version "4.5.4" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.4.tgz#c9ef75b0406ebf195bf5f4ed2304a77ed7df27c7" + integrity sha512-ITpZ+dQc0cXAW1FmDkHJJM+8Lb6anUnin0VB5hLBilnYVdLC0ICFU/KIvT7OXfW9S81DE3U4Vx2EypDG1OYaPA== dependencies: "@octokit/request" "^5.3.0" - "@octokit/types" "^2.0.0" - universal-user-agent "^4.0.0" + "@octokit/types" "^5.0.0" + universal-user-agent "^6.0.0" "@octokit/plugin-paginate-rest@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.2.0.tgz#9ae0c14c1b90ec0d96d2ef1b44706b4505a91cee" - integrity sha512-KoNxC3PLNar8UJwR+1VMQOw2IoOrrFdo5YOiDKnBhpVbKpw+zkBKNMNKwM44UWL25Vkn0Sl3nYIEGKY+gW5ebw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.3.1.tgz#00f91701dfda26227c3e748d42bc89e2d0d9ce55" + integrity sha512-81A+ONLpcSX7vWxnEmVZteQPNsbdeScSVUqjgMYPSk1trzG69iYkhS42wPRWtN0nYw6OEmT48DNeQCjHeyroYw== dependencies: - "@octokit/types" "^2.12.1" + "@octokit/types" "^5.3.0" "@octokit/plugin-request-log@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== -"@octokit/plugin-rest-endpoint-methods@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.10.0.tgz#47f780d69192e45f09f71ded76f0b121b40e2d48" - integrity sha512-Z2DBsdnkWKuVBVFiLoEUKP/82ylH4Ij5F1Mss106hnQYXTxDfCWAyHW+hJ6ophuHVJ9Flaaue3fYn4CggzkHTg== +"@octokit/plugin-rest-endpoint-methods@3.17.0": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz#d8ba04eb883849dd98666c55bf49d8c9fe7be055" + integrity sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg== dependencies: - "@octokit/types" "^2.14.0" + "@octokit/types" "^4.1.6" deprecation "^2.3.1" "@octokit/request-error@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.0.tgz#94ca7293373654400fbb2995f377f9473e00834b" - integrity sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.2.tgz#0e76b83f5d8fdda1db99027ea5f617c2e6ba9ed0" + integrity sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw== dependencies: - "@octokit/types" "^2.0.0" + "@octokit/types" "^5.0.1" deprecation "^2.0.0" once "^1.4.0" "@octokit/request@^5.3.0", "@octokit/request@^5.4.0": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.2.tgz#74f8e5bbd39dc738a1b127629791f8ad1b3193ee" - integrity sha512-zKdnGuQ2TQ2vFk9VU8awFT4+EYf92Z/v3OlzRaSh4RIP0H6cvW1BFPXq4XYvNez+TPQjqN+0uSkCYnMFFhcFrw== + version "5.4.7" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.7.tgz#fd703ee092e0463ceba49ff7a3e61cb4cf8a0fde" + integrity sha512-FN22xUDP0i0uF38YMbOfx6TotpcENP5W8yJM1e/LieGXn6IoRxDMnBf7tx5RKSW4xuUZ/1P04NFZy5iY3Rax1A== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" - "@octokit/types" "^2.11.1" + "@octokit/types" "^5.0.0" deprecation "^2.0.0" - is-plain-object "^3.0.0" + is-plain-object "^4.0.0" node-fetch "^2.3.0" once "^1.4.0" - universal-user-agent "^5.0.0" + universal-user-agent "^6.0.0" "@octokit/rest@^17.0.0": - version "17.8.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-17.8.0.tgz#85da66a98d9f5dfadab079dbb15f6031bd7e5460" - integrity sha512-m2pdo9+DoEoqQ7wRXV1ihffhE1gbvoC20nvchphluEusbZI6Y9HyXABGiXL+mByy2uUMR2cgBDqBJQQ6bY8Uvg== + version "17.11.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-17.11.2.tgz#f3dbd46f9f06361c646230fd0ef8598e59183ead" + integrity sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ== dependencies: "@octokit/core" "^2.4.3" "@octokit/plugin-paginate-rest" "^2.2.0" "@octokit/plugin-request-log" "^1.0.0" - "@octokit/plugin-rest-endpoint-methods" "3.10.0" + "@octokit/plugin-rest-endpoint-methods" "3.17.0" + +"@octokit/types@^4.1.6": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.1.10.tgz#e4029c11e2cc1335051775bc1600e7e740e4aca4" + integrity sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ== + dependencies: + "@types/node" ">= 8" -"@octokit/types@^2.0.0", "@octokit/types@^2.11.1", "@octokit/types@^2.12.1", "@octokit/types@^2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.14.0.tgz#f5afa004c37193afab66b407b7785a8d7c4f102a" - integrity sha512-1w2wxpN45rEXPDFeB7rGain7wcJ/aTRg8bdILITVnS0O7a4zEGELa3JmIe+jeLdekQjvZRbVfNPqS+mi5fKCKQ== +"@octokit/types@^5.0.0", "@octokit/types@^5.0.1", "@octokit/types@^5.3.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.4.1.tgz#d5d5f2b70ffc0e3f89467c3db749fa87fc3b7031" + integrity sha512-OlMlSySBJoJ6uozkr/i03nO5dlYQyE05vmQNZhAh9MyO4DPBP88QlwsDVLmVjIMFssvIZB6WO0ctIGMRG+xsJQ== dependencies: "@types/node" ">= 8" @@ -200,9 +200,9 @@ p-reduce "^2.0.0" "@semantic-release/github@^7.0.0": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-7.0.5.tgz#042b515cbae8695aa60bc4ed17722c34512a5b89" - integrity sha512-1nJCMeomspRIXKiFO3VXtkUMbIBEreYLFNBdWoLjvlUNcEK0/pEbupEZJA3XHfJuSzv43u3OLpPhF/JBrMuv+A== + version "7.0.7" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-7.0.7.tgz#e3999b06433d08871acd68ecec2b4e212c05d09f" + integrity sha512-Sai2UucYQ+5rJzKVEVJ4eiZNDdoo0/CzfpValBdeU5h97uJE7t4CoBTmUWkiXlPOx46CSw1+JhI+PHC1PUxVZw== dependencies: "@octokit/rest" "^17.0.0" "@semantic-release/error" "^2.2.0" @@ -266,10 +266,15 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/minimist@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" + integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + "@types/node@>= 8": - version "13.13.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.5.tgz#96ec3b0afafd64a4ccea9107b75bf8489f0e5765" - integrity sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g== + version "14.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.3.tgz#cc4f979548ca4d8e7b90bc0180052ab99ee64224" + integrity sha512-pC/hkcREG6YfDfui1FBmj8e20jFU5Exjw4NYDm8kEdrW+mOh0T1Zve8DWKnS7ZIZvgncrctcNCXF4Q2I+loyww== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -307,9 +312,9 @@ agent-base@4, agent-base@^4.3.0: es6-promisify "^5.0.0" agent-base@6: - version "6.0.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.0.tgz#5d0101f19bbfaed39980b22ae866de153b93f09a" - integrity sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw== + version "6.0.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" + integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== dependencies: debug "4" @@ -328,17 +333,17 @@ agentkeepalive@^3.4.1: humanize-ms "^1.2.1" aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.5.5: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== +ajv@^6.12.3: + version "6.12.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" + integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -369,12 +374,17 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -427,11 +437,6 @@ argv-formatter@~1.0.0: resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -480,9 +485,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" - integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== + version "1.10.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" + integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== balanced-match@^1.0.0: version "1.0.0" @@ -501,7 +506,7 @@ before-after-hook@^2.1.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== -bin-links@^1.1.2, bin-links@^1.1.7: +bin-links@^1.1.2, bin-links@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.8.tgz#bd39aadab5dc4bdac222a07df5baf1af745b2228" integrity sha512-KgmVfx+QqggqP9dA3iIc5pA4T1qEEEL+hOhOhNPaUm77OTrJoOXE/C05SJLNJe6m/2wUK7F1tDSou7n5TfCDzQ== @@ -602,21 +607,21 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -649,9 +654,9 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2: supports-color "^5.3.0" chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -722,14 +727,14 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" cliui@^6.0.0: version "6.0.0" @@ -807,18 +812,13 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@~2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -compare-func@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" - integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" - dot-prop "^3.0.0" + dot-prop "^5.1.0" concat-map@0.0.1: version "0.0.1" @@ -844,11 +844,11 @@ config-chain@^1.1.12: proto-list "~1.2.1" configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" + integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA== dependencies: - dot-prop "^4.1.0" + dot-prop "^4.2.1" graceful-fs "^4.1.2" make-dir "^1.0.0" unique-string "^1.0.0" @@ -861,46 +861,46 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control- integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= conventional-changelog-angular@^5.0.0: - version "5.0.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" - integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA== + version "5.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz#99a3ca16e4a5305e0c2c2fae3ef74fd7631fc3fb" + integrity sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" q "^1.5.1" conventional-changelog-writer@^4.0.0: - version "4.0.11" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4" - integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw== + version "4.0.17" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz#4753aaa138bf5aa59c0b274cb5937efcd2722e21" + integrity sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw== dependencies: - compare-func "^1.3.1" - conventional-commits-filter "^2.0.2" + compare-func "^2.0.0" + conventional-commits-filter "^2.0.6" dateformat "^3.0.0" - handlebars "^4.4.0" + handlebars "^4.7.6" json-stringify-safe "^5.0.1" lodash "^4.17.15" - meow "^5.0.0" + meow "^7.0.0" semver "^6.0.0" split "^1.0.0" through2 "^3.0.0" -conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz#f122f89fbcd5bb81e2af2fcac0254d062d1039c1" - integrity sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ== +conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz#0935e1240c5ca7698329affee1b6a46d33324c4c" + integrity sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw== dependencies: lodash.ismatch "^4.4.0" modify-values "^1.0.0" conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" - integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz#10140673d5e7ef5572633791456c5d03b69e8be4" + integrity sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" lodash "^4.17.15" - meow "^5.0.0" + meow "^7.0.0" split2 "^2.0.0" through2 "^3.0.0" trim-off-newlines "^1.0.0" @@ -961,9 +961,9 @@ cross-spawn@^6.0.0: which "^1.2.9" cross-spawn@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -979,13 +979,6 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -1029,7 +1022,7 @@ debuglog@*, debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize-keys@^1.0.0: +decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= @@ -1106,19 +1099,19 @@ dir-glob@^3.0.0, dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= +dot-prop@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: is-obj "^1.0.0" -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== +dot-prop@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== dependencies: - is-obj "^1.0.0" + is-obj "^2.0.0" dotenv@^5.0.1: version "5.0.1" @@ -1160,17 +1153,22 @@ editor@~1.0.0: resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - iconv-lite "~0.4.13" + iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" @@ -1286,9 +1284,9 @@ execa@^1.0.0: strip-eof "^1.0.0" execa@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.0.tgz#7f37d6ec17f09e6b8fc53288611695b6d12b9daf" - integrity sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA== + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -1321,9 +1319,9 @@ fast-deep-equal@^3.1.1: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.1.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" - integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -1338,9 +1336,9 @@ fast-json-stable-stringify@^2.0.0: integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fastq@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801" - integrity sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== dependencies: reusify "^1.0.4" @@ -1375,7 +1373,7 @@ find-npm-prefix@^1.0.2: resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA== -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -1443,9 +1441,9 @@ from2@^2.1.0, from2@^2.3.0: readable-stream "^2.0.0" fs-extra@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" @@ -1507,7 +1505,7 @@ genfun@^5.0.0: resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== -gentle-fs@^2.3.0: +gentle-fs@^2.3.0, gentle-fs@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.3.1.tgz#11201bf66c18f930ddca72cf69460bdfa05727b1" integrity sha512-OlwBBwqCFPcjm33rF2BjW+Pr6/ll2741l+xooiwTCeaX2CA1ZuclavyMBe0/KlR21/XGsgY6hzEQZ15BdNa13Q== @@ -1547,9 +1545,9 @@ get-stream@^4.0.0, get-stream@^4.1.0: pump "^3.0.0" get-stream@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" @@ -1599,9 +1597,9 @@ global-dirs@^0.1.0: ini "^1.3.4" globby@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" - integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -1632,7 +1630,7 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -handlebars@^4.4.0: +handlebars@^4.7.6: version "4.7.6" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== @@ -1650,13 +1648,18 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -1695,11 +1698,11 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.8: integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hosted-git-info@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d" - integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.5.tgz#bea87905ef7317442e8df3087faa3c842397df03" + integrity sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ== dependencies: - lru-cache "^5.1.1" + lru-cache "^6.0.0" http-cache-semantics@^3.8.1: version "3.8.1" @@ -1760,12 +1763,12 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@~0.4.13: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== dependencies: - safer-buffer ">= 2.1.2 < 3" + safer-buffer ">= 2.1.2 < 3.0.0" iferr@^0.1.5: version "0.1.5" @@ -1785,9 +1788,9 @@ ignore-walk@^3.0.1: minimatch "^3.0.4" ignore@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== import-fresh@^3.1.0: version "3.2.1" @@ -1814,11 +1817,6 @@ imurmurhash@*, imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -1874,11 +1872,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -1970,6 +1963,11 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -1982,12 +1980,10 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" +is-plain-object@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-4.1.1.tgz#1a14d6452cbd50790edc7fdaa0aed5a40a35ebb5" + integrity sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA== is-redirect@^1.0.0: version "1.0.0" @@ -1995,9 +1991,9 @@ is-redirect@^1.0.0: integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= is-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" - integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: has-symbols "^1.0.1" @@ -2050,11 +2046,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -2091,6 +2082,11 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-bet resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -2130,6 +2126,11 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -2149,14 +2150,7 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -libcipm@^4.0.7: +libcipm@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89" integrity sha512-IN3hh2yDJQtZZ5paSV4fbvJg4aHxCCg5tcZID/dSVlTuUiWktsgaldVljJv6Z5OUlYspx6xQkbR0efNodnIrOA== @@ -2276,10 +2270,10 @@ libnpmteam@^1.0.2: get-stream "^4.0.0" npm-registry-fetch "^4.0.0" -libnpx@^10.2.2: - version "10.2.3" - resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.3.tgz#d5e01f12d383ffca9a947807ca6a8f587d38fe2c" - integrity sha512-bCvdARu55fLQBhMfcYGF0GznF1kB2sqxq/9zKZ3652M8DDFWpVpCnpgzjzn0yWMDMez5ZGMBiX24yR11uEYZVQ== +libnpx@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.4.tgz#ef0e3258e29aef2ec7ee3276115e20e67f67d4ee" + integrity sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA== dependencies: dotenv "^5.0.1" npm-package-arg "^6.0.0" @@ -2288,7 +2282,7 @@ libnpx@^10.2.2: update-notifier "^2.3.0" which "^1.3.0" y18n "^4.0.0" - yargs "^11.0.0" + yargs "^14.2.3" lines-and-columns@^1.1.6: version "1.1.6" @@ -2339,9 +2333,9 @@ locate-path@^5.0.0: p-locate "^4.1.0" lock-verify@^2.0.2, lock-verify@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.0.tgz#12432feb68bb647071c78c44bde16029a0f7d935" - integrity sha512-BhM1Vqsu7x0s+EalTifNjdDPks+ZjdAhComvnA6VcCIlDOI5ouELXqAe1BYuEIP4zGN0W08xVm6byJV1LnCiJg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.1.tgz#81107948c51ed16f97b96ff8b60675affb243fc1" + integrity sha512-n0Zw2DVupKfZMazy/HIFVNohJ1z8fIoZ77WBnyyBGG6ixw83uJNyrbiJvvHWe1QKkGiBCjj8RCPlymltliqEww== dependencies: "@iarna/cli" "^1.2.0" npm-package-arg "^6.1.0" @@ -2460,17 +2454,9 @@ lodash.without@~4.4.0: integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= lodash@^4.17.15, lodash@^4.17.4: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== lowercase-keys@^1.0.0: version "1.0.1" @@ -2492,10 +2478,17 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + macos-release@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" + integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== make-dir@^1.0.0: version "1.3.0" @@ -2521,22 +2514,15 @@ make-fetch-happen@^5.0.0: socks-proxy-agent "^4.0.0" ssri "^6.0.0" -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== marked-terminal@^4.0.0: version "4.1.0" @@ -2551,14 +2537,14 @@ marked-terminal@^4.0.0: supports-hyperlinks "^2.1.0" marked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.0.0.tgz#d35784245a04871e5988a491e28867362e941693" - integrity sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng== + version "1.1.1" + resolved "https://registry.yarnpkg.com/marked/-/marked-1.1.1.tgz#e5d61b69842210d5df57b05856e0c91572703e6a" + integrity sha512-mJzT8D2yPxoPh7h0UXkB+dBj4FykPJ2OIfxAWeIHrvoHDkFxukV/29QxoFQoPM6RLEwhIFdJpmKBlqVM3s2ZIw== -meant@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" - integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg== +meant@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.2.tgz#5d0c78310a3d8ae1408a16be0fe0bd42a969f560" + integrity sha512-KN+1uowN/NK+sT/Lzx7WSGIj2u+3xe5n2LbwObfjOhPZiA+cCfCm6idVl0RkEfjThkw5XJ96CyRcanq6GmKtUg== mem@^1.1.0: version "1.1.0" @@ -2567,29 +2553,22 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== +meow@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" merge-stream@^2.0.0: version "2.0.0" @@ -2597,9 +2576,9 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.0, micromatch@^4.0.2: version "4.0.2" @@ -2622,20 +2601,25 @@ mime-types@^2.1.12, mime-types@~2.1.19: mime-db "1.44.0" mime@^2.4.3: - version "2.4.5" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.5.tgz#d8de2ecb92982dedbb6541c9b6841d7f218ea009" - integrity sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w== + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2643,13 +2627,14 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" + kind-of "^6.0.3" minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" @@ -2727,9 +2712,9 @@ mute-stream@~0.0.4: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nerf-dart@^1.0.0: version "1.0.0" @@ -2787,7 +2772,7 @@ nopt@^4.0.1, nopt@^4.0.3: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -2798,11 +2783,11 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package- validate-npm-package-license "^3.0.1" normalize-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-5.0.0.tgz#f46c9dc20670495e4e18fbd1b4396e41d199f63c" - integrity sha512-bAEm2fx8Dq/a35Z6PIRkkBBJvR56BbEJvhpNtvCZ4W9FyORSna77fn+xtYFjqk5JpBS+fMnAOG/wFgkQBmB7hw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-5.1.0.tgz#04b8f1b34ea49ff713fc20b2218eba41fb9974a3" + integrity sha512-UxHuSWsSAmzSqN+DSjasaZWQ3QPtEisHdlr4y9MJ5zg0RcImv5fQt8QM0izJSCdsdmhJGK+ubcTpJXwVDmwSVQ== -npm-audit-report@^1.3.2: +npm-audit-report@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.3.tgz#8226deeb253b55176ed147592a3995442f2179ed" integrity sha512-8nH/JjsFfAWMvn474HB9mpmMjrnKb1Hx/oTAdjv4PT9iZBvBxiZ+wtDUapHCJwLqYGQVPaAfs+vL5+5k9QndXw== @@ -2829,7 +2814,7 @@ npm-install-checks@^3.0.2: dependencies: semver "^2.3.0 || 3.x || 4 || 5" -npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.4: +npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== @@ -2890,10 +2875,10 @@ npm-profile@^4.0.2, npm-profile@^4.0.4: figgy-pudding "^3.4.1" npm-registry-fetch "^4.0.0" -npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz#cb87cf7f25bfb048d6c3ee19d115bebf93ea5bfa" - integrity sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q== +npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz#57951bf6541e0246b34c9f9a38ab73607c9449d7" + integrity sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ== dependencies: JSONStream "^1.3.4" bluebird "^3.5.1" @@ -2923,9 +2908,9 @@ npm-user-validate@~1.0.0: integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE= npm@^6.10.3: - version "6.14.6" - resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.6.tgz#1a81ce1fac2bf5457dbf6342ceed503627ff228f" - integrity sha512-axnz6iHFK6WPE0js/+mRp+4IOwpHn5tJEw5KB6FiCU764zmffrhsYHbSHi2kKqNkRBt53XasXjngZfBD3FQzrQ== + version "6.14.8" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.8.tgz#64ef754345639bc035982ec3f609353c8539033c" + integrity sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A== dependencies: JSONStream "^1.3.5" abbrev "~1.1.1" @@ -2933,7 +2918,7 @@ npm@^6.10.3: ansistyles "~0.1.3" aproba "^2.0.0" archy "~1.0.0" - bin-links "^1.1.7" + bin-links "^1.1.8" bluebird "^3.5.5" byte-size "^5.0.1" cacache "^12.0.3" @@ -2945,7 +2930,6 @@ npm@^6.10.3: cmd-shim "^3.0.3" columnify "~1.5.4" config-chain "^1.1.12" - debuglog "*" detect-indent "~5.0.0" detect-newline "^2.1.0" dezalgo "~1.0.3" @@ -2954,13 +2938,12 @@ npm@^6.10.3: find-npm-prefix "^1.0.2" fs-vacuum "~1.2.10" fs-write-stream-atomic "~1.0.10" - gentle-fs "^2.3.0" + gentle-fs "^2.3.1" glob "^7.1.6" graceful-fs "^4.2.4" has-unicode "~2.0.1" hosted-git-info "^2.8.8" iferr "^1.0.2" - imurmurhash "*" infer-owner "^1.0.4" inflight "~1.0.6" inherits "^2.0.4" @@ -2969,44 +2952,38 @@ npm@^6.10.3: is-cidr "^3.0.0" json-parse-better-errors "^1.0.2" lazy-property "~1.0.0" - libcipm "^4.0.7" + libcipm "^4.0.8" libnpm "^3.0.1" libnpmaccess "^3.0.2" libnpmhook "^5.0.3" libnpmorg "^1.0.1" libnpmsearch "^2.0.2" libnpmteam "^1.0.2" - libnpx "^10.2.2" + libnpx "^10.2.4" lock-verify "^2.1.0" lockfile "^1.0.4" - lodash._baseindexof "*" lodash._baseuniq "~4.6.0" - lodash._bindcallback "*" - lodash._cacheindexof "*" - lodash._createcache "*" - lodash._getnative "*" lodash.clonedeep "~4.5.0" - lodash.restparam "*" lodash.union "~4.6.0" lodash.uniq "~4.5.0" lodash.without "~4.4.0" lru-cache "^5.1.1" - meant "~1.0.1" + meant "^1.0.2" mississippi "^3.0.0" mkdirp "^0.5.5" move-concurrently "^1.0.1" node-gyp "^5.1.0" nopt "^4.0.3" normalize-package-data "^2.5.0" - npm-audit-report "^1.3.2" + npm-audit-report "^1.3.3" npm-cache-filename "~1.0.2" npm-install-checks "^3.0.2" - npm-lifecycle "^3.1.4" + npm-lifecycle "^3.1.5" npm-package-arg "^6.1.1" npm-packlist "^1.4.8" npm-pick-manifest "^3.0.2" npm-profile "^4.0.4" - npm-registry-fetch "^4.0.5" + npm-registry-fetch "^4.0.7" npm-user-validate "~1.0.0" npmlog "~4.1.2" once "~1.4.0" @@ -3112,16 +3089,16 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0: wrappy "1" onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" opener@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== os-homedir@^1.0.0: version "1.0.2" @@ -3137,15 +3114,6 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-name@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" @@ -3167,11 +3135,6 @@ osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - p-each-series@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" @@ -3189,11 +3152,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-is-promise@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" @@ -3340,13 +3298,13 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" path-exists@^3.0.0: @@ -3391,13 +3349,6 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3542,10 +3493,10 @@ query-string@^6.8.2: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== qw@~1.0.1: version "1.0.1" @@ -3584,16 +3535,14 @@ read-installed@~4.0.3: graceful-fs "^4.1.2" "read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13, read-package-json@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" - integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== dependencies: glob "^7.1.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" normalize-package-data "^2.0.0" npm-normalize-package-bin "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" read-package-tree@^5.3.1: version "5.3.1" @@ -3612,15 +3561,7 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^7.0.0: +read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== @@ -3638,15 +3579,6 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - read-pkg@^5.0.0, read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -3706,13 +3638,13 @@ readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: graceful-fs "^4.1.2" once "^1.3.0" -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" + indent-string "^4.0.0" + strip-indent "^3.0.0" redeyed@~2.1.0: version "2.1.1" @@ -3721,11 +3653,6 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== - registry-auth-token@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -3735,9 +3662,9 @@ registry-auth-token@^3.0.1: safe-buffer "^5.0.1" registry-auth-token@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" - integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" + integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== dependencies: rc "^1.2.8" @@ -3850,15 +3777,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semantic-release@^17.0.7: - version "17.0.7" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.0.7.tgz#03792bf6e1a9ad2353dfd0da6a5d5511fa672b06" - integrity sha512-F6FzJI1yiGavzCTXir4yPthK/iozZPJ4myUYndiHhSHbmOcCSJ2m7V+P6sFwVpDpQKQp1Q31M68sTJ/Q/27Bow== +semantic-release@^17.1.1: + version "17.1.1" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.1.1.tgz#d9775968e841b2b7c5020559e4481aea8520ca75" + integrity sha512-9H+207eynBJElrQBHySZm+sIEoJeUhPA2zU4cdlY1QSInd2lnE8GRD2ALry9EassE22c9WW+aCREwBhro5AIIg== dependencies: "@semantic-release/commit-analyzer" "^8.0.0" "@semantic-release/error" "^2.2.0" @@ -4152,6 +4079,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -4215,6 +4151,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -4237,10 +4180,12 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" strip-json-comments@~2.0.1: version "2.0.1" @@ -4255,9 +4200,9 @@ supports-color@^5.3.0: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -4323,10 +4268,11 @@ through2@^2.0.0, through2@^2.0.2, through2@~2.0.0: xtend "~4.0.1" through2@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== dependencies: + inherits "^2.0.4" readable-stream "2 || 3" through@2, "through@>=2.2.7 <3": @@ -4364,10 +4310,10 @@ traverse@~0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== trim-off-newlines@^1.0.0: version "1.0.1" @@ -4396,6 +4342,11 @@ type-fest@^0.12.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.12.0.tgz#f57a27ab81c68d136a51fd71467eff94157fa1ee" integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -4412,11 +4363,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= uglify-js@^3.1.4: - version "3.9.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.2.tgz#012b74fb6a2e440d9ba1f79110a479d3b1f2d48d" - integrity sha512-zGVwKslUAD/EeqOrD1nQaBmXIHl1Vw371we8cvS8I6mYK9rmgX5tv8AAeJdfsQ3Kk5mGax2SVV/AizxdNGhl7Q== - dependencies: - commander "~2.20.3" + version "3.10.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.3.tgz#f0d2f99736c14de46d2d24649ba328be3e71c3bf" + integrity sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g== uid-number@0.0.6: version "0.0.6" @@ -4456,13 +4405,6 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -universal-user-agent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" - integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg== - dependencies: - os-name "^3.1.0" - universal-user-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" @@ -4470,6 +4412,11 @@ universal-user-agent@^5.0.0: dependencies: os-name "^3.1.0" +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" @@ -4502,9 +4449,9 @@ update-notifier@^2.2.0, update-notifier@^2.3.0, update-notifier@^2.5.0: xdg-basedir "^3.0.0" uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0" @@ -4607,9 +4554,9 @@ widest-line@^2.0.0: string-width "^2.1.1" windows-release@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.0.tgz#dce167e9f8be733f21c849ebd4d03fe66b29b9f0" - integrity sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ== + version "3.3.3" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== dependencies: execa "^1.0.0" @@ -4633,6 +4580,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -4686,21 +4642,25 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.7.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.9.2.tgz#f0cfa865f003ab707663e4f04b3956957ea564ed" - integrity sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg== - dependencies: - "@babel/runtime" "^7.9.2" + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs-parser@^18.1.1: +yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -4715,35 +4675,27 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= +yargs@^14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== dependencies: - camelcase "^4.1.0" - -yargs@^11.0.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" - integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^3.1.0" + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" require-directory "^2.1.1" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^2.0.0" + string-width "^3.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" + y18n "^4.0.0" + yargs-parser "^15.0.1" yargs@^15.0.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -4755,7 +4707,7 @@ yargs@^15.0.1: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.1" + yargs-parser "^18.1.2" yargs@^8.0.2: version "8.0.2"