From b3f713e050a6f5ce529d54c8b478c43c1774f373 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Wed, 10 May 2023 16:12:04 +0800 Subject: [PATCH 001/233] =?UTF-8?q?=E6=95=B4=E7=90=86=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/configuration.yml.example | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/configuration.yml.example b/config/configuration.yml.example index be8d59997..f5f17f59c 100644 --- a/config/configuration.yml.example +++ b/config/configuration.yml.example @@ -23,9 +23,9 @@ default: &default redirect_uri: 'https://test.a.com/api/auth/educoder/callback' gitea: - access_key_id: '' - access_key_secret: '' - domain: 'https://testgit.trustie.net' + access_key_id: <%=ENV.fetch("GITEA_DOMAIN", 'test') %> + access_key_secret: <%=ENV.fetch("GITEA_DOMAIN", 'test123123') %> + domain: <%=ENV.fetch("GITEA_DOMAIN", 'https://gitea.test.com') %> base_url: '/api/v1' admin_token: '123123' hat_base_url: '/api/hat' From 3d0cd96e328f40af2fbf9067d00bc6cbbd97c4f3 Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Thu, 11 May 2023 09:00:09 +0800 Subject: [PATCH 002/233] issue index to name --- app/controllers/issues_controller.rb | 9 +++++++-- config/routes.rb | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index c1f2ea1f0..be6662147 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -1,12 +1,12 @@ class IssuesController < ApplicationController - before_action :require_login, except: [:index, :show, :index_chosen] + before_action :require_login, except: [:index, :show, :index_chosen, :index_to_name] before_action :require_profile_completed, only: [:create] before_action :load_project before_action :set_user before_action :check_menu_authorize, except: [:index_chosen] before_action :check_issue_permission before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update, :copy] - before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue] + before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue, :index_to_name] before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue] before_action :check_token_enough, :find_atme_receivers, only: [:create, :update] @@ -49,6 +49,11 @@ class IssuesController < ApplicationController @issue_chosen = issue_left_chosen(@project, nil) end + def index_to_name + issues_result = @project.issues.where(project_issues_index:params[:index]).map{|e|{project_issues_index:e.project_issues_index,subject:e.subject}} + render json: issues_result + end + def commit_issues issues = @project.issues.issue_issue.includes(:user,:tracker) issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user)) diff --git a/config/routes.rb b/config/routes.rb index f36aaa165..f34c9d44e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -574,6 +574,7 @@ Rails.application.routes.draw do get :index_chosen post :clean post :series_update + get :index_to_name end member do post :copy From 23e8bea50739b587bd0d516228ad3f8194204849 Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Thu, 11 May 2023 09:38:07 +0800 Subject: [PATCH 003/233] update issue index_to_name response data --- app/controllers/issues_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index be6662147..30868ccf6 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -50,7 +50,7 @@ class IssuesController < ApplicationController end def index_to_name - issues_result = @project.issues.where(project_issues_index:params[:index]).map{|e|{project_issues_index:e.project_issues_index,subject:e.subject}} + issues_result = @project.issues.where(project_issues_index:params[:index]).map{|e|{id:e.id,project_issues_index:e.project_issues_index,subject:e.subject}} render json: issues_result end From afe87a2ff15f40cdabf7cf93a79b908cbc0ee01e Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Thu, 11 May 2023 16:18:43 +0800 Subject: [PATCH 004/233] change response for index to name for issue --- app/controllers/issues_controller.rb | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 30868ccf6..0015b518e 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -50,7 +50,23 @@ class IssuesController < ApplicationController end def index_to_name - issues_result = @project.issues.where(project_issues_index:params[:index]).map{|e|{id:e.id,project_issues_index:e.project_issues_index,subject:e.subject}} + issues_index = params[:index].map(&:to_i) + exit_index = [] + issues_result = @project.issues.where(project_issues_index:issues_index).map{ |e| + exit_index << e.project_issues_index + { + id:e.id, + project_issues_index:e.project_issues_index, + subject:e.subject + } + + } + not_exit = issues_index - exit_index + not_exit.map{|e| + issues_result << {id: nil, + project_issues_index:e, + subject: nil} + } render json: issues_result end From 6b68de130ca15f236eadcfd2e6a4c0738d4313db Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 18 May 2023 09:17:27 +0800 Subject: [PATCH 005/233] =?UTF-8?q?fixed=20=E6=8F=90=E4=BA=A4=E8=80=85?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=94=A8=E6=88=B7email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index c9be515d2..0f3f27ac0 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -36,12 +36,20 @@ module RepositoriesHelper end def render_cache_commit_author(author_json) + user = nil if author_json["name"].present? && author_json["email"].present? - return find_user_in_redis_cache(author_json['name'], author_json['email']) + user = find_user_in_redis_cache(author_json['name'], author_json['email']) end if author_json["Name"].present? && author_json["Email"].present? - return find_user_in_redis_cache(author_json['Name'], author_json['Email']) + user = find_user_in_redis_cache(author_json['Name'], author_json['Email']) end + if user.blank? && author_json["email"].present? + user = User.find_by(mail: author_json["email"]) + end + if user.blank? && author_json["Email"].present? + user = User.find_by(mail: author_json["Email"]) + end + user end def readme_render_decode64_content(str, owner, repo, ref, path) From bea6442a1c7febed609e8db87d3361e163770ee3 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 18 May 2023 09:19:45 +0800 Subject: [PATCH 006/233] =?UTF-8?q?fixed=20=E6=8F=90=E4=BA=A4=E8=80=85?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=94=A8=E6=88=B7email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index c9be515d2..0f3f27ac0 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -36,12 +36,20 @@ module RepositoriesHelper end def render_cache_commit_author(author_json) + user = nil if author_json["name"].present? && author_json["email"].present? - return find_user_in_redis_cache(author_json['name'], author_json['email']) + user = find_user_in_redis_cache(author_json['name'], author_json['email']) end if author_json["Name"].present? && author_json["Email"].present? - return find_user_in_redis_cache(author_json['Name'], author_json['Email']) + user = find_user_in_redis_cache(author_json['Name'], author_json['Email']) end + if user.blank? && author_json["email"].present? + user = User.find_by(mail: author_json["email"]) + end + if user.blank? && author_json["Email"].present? + user = User.find_by(mail: author_json["Email"]) + end + user end def readme_render_decode64_content(str, owner, repo, ref, path) From ee62c394fca270d8dbd7ee76578b1fe6d5d98177 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 18 May 2023 09:32:36 +0800 Subject: [PATCH 007/233] =?UTF-8?q?fixed=20=E5=AE=A1=E6=89=B9utf8mb4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20230518012718_add_forge_applied_message_utf8mb4.rb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 db/migrate/20230518012718_add_forge_applied_message_utf8mb4.rb diff --git a/db/migrate/20230518012718_add_forge_applied_message_utf8mb4.rb b/db/migrate/20230518012718_add_forge_applied_message_utf8mb4.rb new file mode 100644 index 000000000..a12fbd291 --- /dev/null +++ b/db/migrate/20230518012718_add_forge_applied_message_utf8mb4.rb @@ -0,0 +1,5 @@ +class AddForgeAppliedMessageUtf8mb4 < ActiveRecord::Migration[5.2] + def change + execute("ALTER TABLE `forge_applied_messages` MODIFY `name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") + end +end From 2aeaee847962921326f7674d037be0a804e2d8f7 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 18 May 2023 10:21:32 +0800 Subject: [PATCH 008/233] =?UTF-8?q?fixed=20=E9=A1=B9=E7=9B=AE=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=EF=BC=8C=E6=A0=87=E8=AF=86=EF=BC=8C=E6=89=80=E6=9C=89?= =?UTF-8?q?=E8=80=85=E5=8F=98=E5=8C=96=E6=97=B6=E9=87=8D=E7=BD=AE=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 6e7d258aa..192288019 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -238,6 +238,13 @@ class ProjectsController < ApplicationController def simple # 为了缓存活跃项目的基本信息,后续删除 Cache::V2::ProjectCommonService.new(@project.id).read + # 项目名称,标识,所有者变化时重置缓存 + project_common = $redis_cache.hgetall("v2-project-common:#{@project.id}") + if project_common.present? + if project_common["name"] != @project.name || project_common["identifier"] != @project.identifier || project_common["owner_id"] != @project.user_id + Cache::V2::ProjectCommonService.new(@project.id).reset + end + end json_response(@project, current_user) end From 09b1007800391eb2f29e859f7fb93a6bdf272d4d Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 18 May 2023 14:22:53 +0800 Subject: [PATCH 009/233] =?UTF-8?q?fixed=20=E8=B4=A1=E7=8C=AE=E8=80=85?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=94=A8=E6=88=B7email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repositories/_contributor.json.jbuilder | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/app/views/repositories/_contributor.json.jbuilder b/app/views/repositories/_contributor.json.jbuilder index b0547eba3..2deab09d2 100644 --- a/app/views/repositories/_contributor.json.jbuilder +++ b/app/views/repositories/_contributor.json.jbuilder @@ -1,20 +1,33 @@ -user = $redis_cache.hgetall("v2-owner-common:#{contributor["name"] || contributor["login"]}-#{contributor["email"]}") -if user.blank? +user = render_cache_commit_author(contributor) +if user.present? + if user.is_a?(Hash) + json.contributions contributor["commits"] || contributor["contributions"] + json.id user["id"] + json.login user["login"] + json.email user["email"] + json.type user["type"] + json.name (user["name"] || contributor["name"] || contributor["login"]).to_s.downcase + json.image_url user["avatar_url"] + db_user = User.find_by_id(user["id"]) + json.contribution_perc db_user.simple_contribution_perc(project, contributor["contribution_perc"]) if db_user.present? + else + json.contributions contributor["commits"] || contributor["contributions"] + json.id user.id + json.login user.login + json.email user.mail + json.type user.type + json.name user.real_name + json.image_url url_to_avatar(user) + json.contribution_perc user.simple_contribution_perc(project, contributor["contribution_perc"]) if user.present? + end +else json.contributions contributor["commits"] || contributor["contributions"] + json.id nil json.login nil json.type nil json.name (contributor["name"] || contributor["login"]).to_s.downcase json.email contributor["email"] json.image_url User::Avatar.get_letter_avatar_url(contributor["name"] || contributor["login"]) json.contribution_perc User.new(login: (contributor["name"] || contributor["login"]), mail: contributor["email"]).simple_contribution_perc(project, contributor["contribution_perc"]) -else - json.contributions contributor["commits"] || contributor["contributions"] - json.id user["id"] - json.login user["login"] - json.email user["email"] - json.type user["type"] - json.name (user["name"] || contributor["name"] || contributor["login"]).to_s.downcase - json.image_url user["avatar_url"] - db_user = User.find_by_id(user["id"]) - json.contribution_perc db_user.simple_contribution_perc(project, contributor["contribution_perc"]) if db_user.present? end + From 8fbf1b4a35d40222f5efb9cb3c22680b1faae289 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 18 May 2023 14:26:38 +0800 Subject: [PATCH 010/233] =?UTF-8?q?fixed=20=E8=B4=A1=E7=8C=AE=E8=80=85?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=94=A8=E6=88=B7email=EF=BC=8C=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=8C=BA=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/repositories/_contributor.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/repositories/_contributor.json.jbuilder b/app/views/repositories/_contributor.json.jbuilder index 2deab09d2..861efb8bb 100644 --- a/app/views/repositories/_contributor.json.jbuilder +++ b/app/views/repositories/_contributor.json.jbuilder @@ -16,7 +16,7 @@ if user.present? json.login user.login json.email user.mail json.type user.type - json.name user.real_name + json.name (user["name"] || contributor["name"] || contributor["login"]).to_s.downcase json.image_url url_to_avatar(user) json.contribution_perc user.simple_contribution_perc(project, contributor["contribution_perc"]) if user.present? end From eb7e658a7de799886d891519968387e6b502187f Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Sat, 20 May 2023 12:27:34 +0800 Subject: [PATCH 011/233] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9user=20login?= =?UTF-8?q?=E5=94=AF=E4=B8=80=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20230520133729_add_user_login_uniq_index.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 db/migrate/20230520133729_add_user_login_uniq_index.rb diff --git a/db/migrate/20230520133729_add_user_login_uniq_index.rb b/db/migrate/20230520133729_add_user_login_uniq_index.rb new file mode 100644 index 000000000..4527d9d29 --- /dev/null +++ b/db/migrate/20230520133729_add_user_login_uniq_index.rb @@ -0,0 +1,12 @@ +class AddForgeAppliedMessageUtf8mb4 < ActiveRecord::Migration[5.2] + def change + + users = User.group("login").having("count(1) >1") + ids = users.pluck(:id) + logins = users.pluck(:login) + User.where(login: logins).where.not(id: ids).destroy_all + + remove_index :users, :login + add_index :users, :login, unique: true + end +end From ef88c31b96d00f604f8700a8598b77ea72010ed4 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Sat, 20 May 2023 12:28:35 +0800 Subject: [PATCH 012/233] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9user=20login?= =?UTF-8?q?=E5=94=AF=E4=B8=80=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20230520133729_add_user_login_uniq_index.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20230520133729_add_user_login_uniq_index.rb b/db/migrate/20230520133729_add_user_login_uniq_index.rb index 4527d9d29..f1990afce 100644 --- a/db/migrate/20230520133729_add_user_login_uniq_index.rb +++ b/db/migrate/20230520133729_add_user_login_uniq_index.rb @@ -1,4 +1,4 @@ -class AddForgeAppliedMessageUtf8mb4 < ActiveRecord::Migration[5.2] +class AddUserLoginUniqIndex < ActiveRecord::Migration[5.2] def change users = User.group("login").having("count(1) >1") From 2c0c6a1a77b0095c806e719f77053de19bb055ab Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Sat, 20 May 2023 11:35:20 +0800 Subject: [PATCH 013/233] =?UTF-8?q?fixed=20=E6=B8=85=E9=99=A4user=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=85=B3=E8=81=94=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index ba8afffa4..5e0ff12d7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -127,13 +127,13 @@ class User < Owner has_many :versions has_many :issue_times, :dependent => :destroy - has_one :onclick_time, :dependent => :destroy + # has_one :onclick_time, :dependent => :destroy # 新版私信 - has_many :private_messages, dependent: :destroy + # has_many :private_messages, dependent: :destroy has_many :recent_contacts, through: :private_messages, source: :target has_many :tidings, :dependent => :destroy - has_many :journals_for_messages, :as => :jour, :dependent => :destroy + # has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :attachments,foreign_key: :author_id, :dependent => :destroy @@ -143,7 +143,7 @@ class User < Owner has_many :apply_user_authentication has_one :process_real_name_apply, -> { processing.real_name_auth.order(created_at: :desc) }, class_name: 'ApplyUserAuthentication' has_one :process_professional_apply, -> { processing.professional_auth.order(created_at: :desc) }, class_name: 'ApplyUserAuthentication' - has_many :apply_actions, dependent: :destroy + # has_many :apply_actions, dependent: :destroy has_many :trail_auth_apply_actions, -> { where(container_type: 'TrialAuthorization') }, class_name: 'ApplyAction' # has_many :attendances From 41465a456e2c8a4391ccea94251bc4323f80822b Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Mon, 22 May 2023 11:21:46 +0800 Subject: [PATCH 014/233] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9user=20login?= =?UTF-8?q?=E5=94=AF=E4=B8=80=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tasks/repair_gitea_user.rake.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 lib/tasks/repair_gitea_user.rake.rb diff --git a/lib/tasks/repair_gitea_user.rake.rb b/lib/tasks/repair_gitea_user.rake.rb new file mode 100644 index 000000000..7f14325be --- /dev/null +++ b/lib/tasks/repair_gitea_user.rake.rb @@ -0,0 +1,25 @@ +namespace :repair_gitea_user do + desc "If forge users gitea_uid is null repair gitea user" + task done: :environment do + users = User.find_by_sql("SELECT * FROM `users` WHERE id !=2 AND type='User' AND NOT EXISTS (SELECT * FROM forgegitea.`user` WHERE forgegitea.`user`.id=users.gitea_uid)") + puts "total users count:#{users.count}" + success_count = 0 + users.each do |user| + begin + interactor = Gitea::RegisterInteractor.call({ username: user.login, email: user.mail, password: "abc12345678" }) + if interactor.success? + gitea_user = interactor.result + result = Gitea::User::GenerateTokenService.call(user.login, password) + user.gitea_token = result['sha1'] + user.gitea_uid = gitea_user[:body]['id'] + user.is_sync_pwd = false + user.save! + success_count = success_count + 1 + end + rescue Exception => e + puts "repair gitea user: #{user.id}:#{user.login}:, error:#{e}" + end + end + puts "repair gitea user success total: #{success_count}" + end +end \ No newline at end of file From c56d3dfd83f790c6429d9496035545fd7120e1dd Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Mon, 22 May 2023 11:27:29 +0800 Subject: [PATCH 015/233] =?UTF-8?q?fixed=20=E8=A1=A5=E5=81=BFusers.gitea?= =?UTF-8?q?=5Fuid=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tasks/{repair_gitea_user.rake.rb => repair_gitea_user.rake} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/tasks/{repair_gitea_user.rake.rb => repair_gitea_user.rake} (100%) diff --git a/lib/tasks/repair_gitea_user.rake.rb b/lib/tasks/repair_gitea_user.rake similarity index 100% rename from lib/tasks/repair_gitea_user.rake.rb rename to lib/tasks/repair_gitea_user.rake From 206b71cf72b2bcb3019aedc1036ab46cf425efa0 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 24 May 2023 14:33:50 +0800 Subject: [PATCH 016/233] =?UTF-8?q?fixed=20=E9=A1=B9=E7=9B=AE=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=A2=9E=E5=8A=A0id=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/queries/projects/list_query.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/queries/projects/list_query.rb b/app/queries/projects/list_query.rb index 72776f7a2..c67feed61 100644 --- a/app/queries/projects/list_query.rb +++ b/app/queries/projects/list_query.rb @@ -29,6 +29,7 @@ class Projects::ListQuery < ApplicationQuery def filter_projects(collection) # collection = by_pinned(collection) collection = by_search(collection) if params[:search].present? + collection = collection.where(id: params[:ids].to_s.split(",")) if params[:ids].present? collection = by_project_type(collection) collection = by_project_category(collection) collection = by_project_language(collection) From 09e674f0c1965dfec506f26cf32cd6d90ab59cf6 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 30 May 2023 11:12:21 +0800 Subject: [PATCH 017/233] =?UTF-8?q?=E7=AB=9E=E8=B5=9B=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=85=B3=E8=81=94=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 1 + app/controllers/users_controller.rb | 5 +++-- app/views/users/get_user_info.json.jbuilder | 2 +- db/migrate/20230530141227_add_user_action_index.rb | 7 +++++++ 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20230530141227_add_user_action_index.rb diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 0b713bdb3..4cec1be47 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -13,6 +13,7 @@ class AccountsController < ApplicationController ActiveRecord::Base.transaction do result = auto_update(current_user, simple_update_params) if result[:message].blank? + UserAction.create(:action_id => current_user.id, :action_type => "sync_educoder_user", :user_id => current_user.id, :ip => request.remote_ip) if params[:platform] == "educoder" render_ok else render_error(result[:message]) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c4c745a7d..9472ad6e5 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -388,10 +388,11 @@ class UsersController < ApplicationController password = "12345678" # 没有用户时,新建用户并登录 - user = User.where("login = ? or phone = ? or mail = ? ", "#{login}", phone, email).first + user = phone.present? ? User.find_by(phone: phone) : nil + user = User.where("login = ? or phone = ? or mail = ? ", "#{login}", phone, email).first if user.nil? if user.present? # 手机号先记录,后续用 - user.update_column(:phone, "#{phone}") if phone.present? + user.update_column(:phone, "#{phone}") if phone.present? && user.phone.blank? else ActiveRecord::Base.transaction do email = "#{login}@gitlink.org.cn" if email.blank? diff --git a/app/views/users/get_user_info.json.jbuilder b/app/views/users/get_user_info.json.jbuilder index a1d689f44..f659190d0 100644 --- a/app/views/users/get_user_info.json.jbuilder +++ b/app/views/users/get_user_info.json.jbuilder @@ -26,6 +26,6 @@ json.super_description @user.super_description json.(@user, :show_email, :show_department, :show_location, :show_super_description) json.message_unread_total @message_unread_total json.has_trace_user @user.trace_user.present? -json.is_new @user.login.present? && params[:login].to_s.include?("#{@user.login}") +json.is_new params[:login].present? && (UserAction.where(action_type: "sync_educoder_user", user_id: @user.id).blank? || @user.mail.include?("@gitlink.org.cn") || @user.mail.include?("@forge.com")) json.nps EduSetting.get("nps-on-off-switch").to_s == 'true' && UserNp.where(user_id: current_user.id).where("created_at >= ?", (Time.now - 30.days).beginning_of_day ).blank? json.sign_cla @user.sign_cla \ No newline at end of file diff --git a/db/migrate/20230530141227_add_user_action_index.rb b/db/migrate/20230530141227_add_user_action_index.rb new file mode 100644 index 000000000..2d76bd478 --- /dev/null +++ b/db/migrate/20230530141227_add_user_action_index.rb @@ -0,0 +1,7 @@ +class AddUserActionIndex < ActiveRecord::Migration[5.2] + def change + add_index :user_actions, :user_id + add_index :user_actions, :action_type + add_index :user_actions, :action_id + end +end From 5fa1709664b9fb04db0956e796d0bd6a07dbd879 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 30 May 2023 11:38:00 +0800 Subject: [PATCH 018/233] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9=E7=94=A8?= =?UTF-8?q?=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 2 ++ app/forms/register/remote_form.rb | 6 +++--- app/services/admins/import_user_from_excel_service.rb | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 01e9bc7bf..727f1f42b 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -8,6 +8,7 @@ class AccountsController < ApplicationController simple_update_params.merge!(username: params[:username]&.gsub(/\s+/, "")) simple_update_params.merge!(email: params[:email]&.gsub(/\s+/, "")) simple_update_params.merge!(platform: (params[:platform] || 'forge')&.gsub(/\s+/, "")) + simple_update_params.merge!(user: current_user) Register::RemoteForm.new(simple_update_params).validate! ActiveRecord::Base.transaction do @@ -27,6 +28,7 @@ class AccountsController < ApplicationController # 其他平台同步注册的用户 def remote_register + remote_register_params.merge!(user: nil) Register::RemoteForm.new(remote_register_params).validate! username = params[:username]&.gsub(/\s+/, "") tip_exception("无法使用以下关键词:#{username},请重新命名") if ReversedKeyword.check_exists?(username) diff --git a/app/forms/register/remote_form.rb b/app/forms/register/remote_form.rb index 59a5fbc82..dabaacdb9 100644 --- a/app/forms/register/remote_form.rb +++ b/app/forms/register/remote_form.rb @@ -1,15 +1,15 @@ module Register class RemoteForm < Register::BaseForm # login 登陆方式,支持邮箱、登陆、手机号等 - attr_accessor :username, :email, :password, :platform + attr_accessor :username, :email, :password, :platform, :user validates :username, :email, :password, presence: true validate :check! def check! Rails.logger.info "Register::RemoteForm params: username: #{username}; email: #{email}; password: #{password}; platform: #{platform}" - check_login(username) - check_mail(email) + check_login(username, user) + check_mail(email,user) check_password(password) end end diff --git a/app/services/admins/import_user_from_excel_service.rb b/app/services/admins/import_user_from_excel_service.rb index 709551c23..ab8e793ce 100644 --- a/app/services/admins/import_user_from_excel_service.rb +++ b/app/services/admins/import_user_from_excel_service.rb @@ -45,7 +45,7 @@ class Admins::ImportUserFromExcelService < ApplicationService password = data.password nickname = data.nickname&.gsub(/\s+/, "") raise Error, "无法使用以下关键词:#{username},请重新命名" if ReversedKeyword.check_exists?(data.login) - Register::RemoteForm.new({username: username, email: email, password: password, platform: 'forge'}).validate! + Register::RemoteForm.new({username: username, email: email, password: password, platform: 'forge', user: nil}).validate! user = User.new(admin: false, login: username, mail: email, nickname: nickname, platform: 'forge' , type: "User") user.password = password user.activate From dbdd2f89689a672a9e65b36882d4d01961457a51 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 30 May 2023 12:32:41 +0800 Subject: [PATCH 019/233] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=8F=82=E6=95=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 7 ++++--- app/forms/register/remote_form.rb | 5 +++-- app/services/admins/import_user_from_excel_service.rb | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 727f1f42b..1cb703e9c 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -8,7 +8,7 @@ class AccountsController < ApplicationController simple_update_params.merge!(username: params[:username]&.gsub(/\s+/, "")) simple_update_params.merge!(email: params[:email]&.gsub(/\s+/, "")) simple_update_params.merge!(platform: (params[:platform] || 'forge')&.gsub(/\s+/, "")) - simple_update_params.merge!(user: current_user) + simple_update_params.merge!(user_id: current_user.id) Register::RemoteForm.new(simple_update_params).validate! ActiveRecord::Base.transaction do @@ -28,7 +28,7 @@ class AccountsController < ApplicationController # 其他平台同步注册的用户 def remote_register - remote_register_params.merge!(user: nil) + remote_register_params.merge!(user_id: nil) Register::RemoteForm.new(remote_register_params).validate! username = params[:username]&.gsub(/\s+/, "") tip_exception("无法使用以下关键词:#{username},请重新命名") if ReversedKeyword.check_exists?(username) @@ -180,7 +180,8 @@ class AccountsController < ApplicationController render_result(-6, e.message) rescue Exception => e Gitea::User::DeleteService.call(user.login) unless user.nil? - uid_logger_error(e.message) + Rails.logger.error("##:register error--#{user.try(:id)}") + logger_error(e) tip_exception(-1, e.message) end end diff --git a/app/forms/register/remote_form.rb b/app/forms/register/remote_form.rb index dabaacdb9..c3eda4358 100644 --- a/app/forms/register/remote_form.rb +++ b/app/forms/register/remote_form.rb @@ -1,13 +1,14 @@ module Register class RemoteForm < Register::BaseForm # login 登陆方式,支持邮箱、登陆、手机号等 - attr_accessor :username, :email, :password, :platform, :user + attr_accessor :username, :email, :password, :platform, :user_id validates :username, :email, :password, presence: true validate :check! def check! - Rails.logger.info "Register::RemoteForm params: username: #{username}; email: #{email}; password: #{password}; platform: #{platform}" + user = User.find_by(id: user_id) + Rails.logger.info "Register::RemoteForm params: id: #{user&.id}; username: #{username}; email: #{email}; password: #{password}; platform: #{platform}" check_login(username, user) check_mail(email,user) check_password(password) diff --git a/app/services/admins/import_user_from_excel_service.rb b/app/services/admins/import_user_from_excel_service.rb index ab8e793ce..b1ade1de2 100644 --- a/app/services/admins/import_user_from_excel_service.rb +++ b/app/services/admins/import_user_from_excel_service.rb @@ -45,7 +45,7 @@ class Admins::ImportUserFromExcelService < ApplicationService password = data.password nickname = data.nickname&.gsub(/\s+/, "") raise Error, "无法使用以下关键词:#{username},请重新命名" if ReversedKeyword.check_exists?(data.login) - Register::RemoteForm.new({username: username, email: email, password: password, platform: 'forge', user: nil}).validate! + Register::RemoteForm.new({username: username, email: email, password: password, platform: 'forge', user_id: nil}).validate! user = User.new(admin: false, login: username, mail: email, nickname: nickname, platform: 'forge' , type: "User") user.password = password user.activate From b6448d127db75c2292dff4bc220e9f3c8b800aab Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 30 May 2023 14:05:11 +0800 Subject: [PATCH 020/233] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=8F=82=E6=95=B0=E6=A0=A1=E9=AA=8C=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 6 ++---- app/services/admins/import_user_from_excel_service.rb | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 1cb703e9c..8e395b833 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -4,12 +4,11 @@ class AccountsController < ApplicationController #skip_before_action :check_account, :only => [:logout] - def simple_update + def simple_update simple_update_params.merge!(username: params[:username]&.gsub(/\s+/, "")) simple_update_params.merge!(email: params[:email]&.gsub(/\s+/, "")) simple_update_params.merge!(platform: (params[:platform] || 'forge')&.gsub(/\s+/, "")) - simple_update_params.merge!(user_id: current_user.id) - Register::RemoteForm.new(simple_update_params).validate! + Register::RemoteForm.new(simple_update_params.merge(user_id: current_user.id)).validate! ActiveRecord::Base.transaction do result = auto_update(current_user, simple_update_params) @@ -28,7 +27,6 @@ class AccountsController < ApplicationController # 其他平台同步注册的用户 def remote_register - remote_register_params.merge!(user_id: nil) Register::RemoteForm.new(remote_register_params).validate! username = params[:username]&.gsub(/\s+/, "") tip_exception("无法使用以下关键词:#{username},请重新命名") if ReversedKeyword.check_exists?(username) diff --git a/app/services/admins/import_user_from_excel_service.rb b/app/services/admins/import_user_from_excel_service.rb index b1ade1de2..709551c23 100644 --- a/app/services/admins/import_user_from_excel_service.rb +++ b/app/services/admins/import_user_from_excel_service.rb @@ -45,7 +45,7 @@ class Admins::ImportUserFromExcelService < ApplicationService password = data.password nickname = data.nickname&.gsub(/\s+/, "") raise Error, "无法使用以下关键词:#{username},请重新命名" if ReversedKeyword.check_exists?(data.login) - Register::RemoteForm.new({username: username, email: email, password: password, platform: 'forge', user_id: nil}).validate! + Register::RemoteForm.new({username: username, email: email, password: password, platform: 'forge'}).validate! user = User.new(admin: false, login: username, mail: email, nickname: nickname, platform: 'forge' , type: "User") user.password = password user.activate From 712fe34c1263fc46fb6df6b3faf714b5ba04a537 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 30 May 2023 14:46:15 +0800 Subject: [PATCH 021/233] =?UTF-8?q?PR=E6=95=B0=E6=8D=AE=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 2 +- app/controllers/pull_requests_controller.rb | 32 ++++++++++++------- .../20230530353459_add_project_pr_admin.rb | 5 +++ 3 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20230530353459_add_project_pr_admin.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 192288019..fc56f1ca9 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -289,7 +289,7 @@ class ProjectsController < ApplicationController def project_params params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url, :default_branch, :identifier, :project_category_id, :project_language_id, :license_id, :ignore_id, :private, - :blockchain, :blockchain_token_all, :blockchain_init_token) + :blockchain, :blockchain_token_all, :blockchain_init_token, :pr_view_admin) end def mirror_params diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index f1039362d..39735687c 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -12,21 +12,28 @@ class PullRequestsController < ApplicationController def index - # @issues = Gitea::PullRequest::ListService.new(@user,@repository.try(:identifier)).call #通过gitea获取 - issues = @project.issues.issue_pull_request.issue_index_includes.includes(pull_request: :user) - issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user)) - @all_issues = issues.distinct - @filter_issues = @all_issues - @filter_issues = @filter_issues.where("issues.subject LIKE ? OR issues.description LIKE ? ", "%#{params[:search]}%", "%#{params[:search]}%") if params[:search].present? - @open_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::OPEN}) - @close_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::CLOSED}) - @merged_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::MERGED}) @user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user)) @user_admin_or_developer = current_user.present? && (current_user.admin || @project.all_developers.include?(current_user)) + if @project.pr_view_admin? && !@project.manager?(current_user) + @open_issues = [] + @close_issues = [] + @merged_issues = [] + @issues_size = 0 + @issues = [] + else + issues = @project.issues.issue_pull_request.issue_index_includes.includes(pull_request: :user) + issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user)) + @all_issues = issues.distinct + @filter_issues = @all_issues + @filter_issues = @filter_issues.where("issues.subject LIKE ? OR issues.description LIKE ? ", "%#{params[:search]}%", "%#{params[:search]}%") if params[:search].present? + @open_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::OPEN}) + @close_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::CLOSED}) + @merged_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::MERGED}) - scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "PullRequest") - @issues_size = scopes.size - @issues = paginate(scopes) + scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "PullRequest") + @issues_size = scopes.size + @issues = paginate(scopes) + end end def new @@ -192,6 +199,7 @@ class PullRequestsController < ApplicationController end def show + tip_exception(403, "你没有权限访问") if @project.pr_view_admin? && !@project.manager?(current_user) @issue_user = @issue.user @issue_assign_to = @issue.get_assign_user @gitea_pull = Gitea::PullRequest::GetService.call(@owner.login, diff --git a/db/migrate/20230530353459_add_project_pr_admin.rb b/db/migrate/20230530353459_add_project_pr_admin.rb new file mode 100644 index 000000000..fd1f5cf41 --- /dev/null +++ b/db/migrate/20230530353459_add_project_pr_admin.rb @@ -0,0 +1,5 @@ +class AddUserActionIndex < ActiveRecord::Migration[5.2] + def change + add_column :projects, :pr_view_admin, :boolean, default: false + end +end From f5c3fe2b8dcfc24fb4cf4c68fc35bb8544a52dc7 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 30 May 2023 14:47:46 +0800 Subject: [PATCH 022/233] =?UTF-8?q?PR=E6=95=B0=E6=8D=AE=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20230530353459_add_project_pr_admin.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20230530353459_add_project_pr_admin.rb b/db/migrate/20230530353459_add_project_pr_admin.rb index fd1f5cf41..85655ae60 100644 --- a/db/migrate/20230530353459_add_project_pr_admin.rb +++ b/db/migrate/20230530353459_add_project_pr_admin.rb @@ -1,4 +1,4 @@ -class AddUserActionIndex < ActiveRecord::Migration[5.2] +class AddProjectPrAdmin < ActiveRecord::Migration[5.2] def change add_column :projects, :pr_view_admin, :boolean, default: false end From 3456ddf526a22190602189814e5e73fe3be45444 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 30 May 2023 15:10:02 +0800 Subject: [PATCH 023/233] =?UTF-8?q?PR=E6=95=B0=E6=8D=AE=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/pull_requests_controller.rb | 31 ++++++++------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 39735687c..0cf022f7c 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -12,28 +12,21 @@ class PullRequestsController < ApplicationController def index + # @issues = Gitea::PullRequest::ListService.new(@user,@repository.try(:identifier)).call #通过gitea获取 + issues = @project.issues.issue_pull_request.issue_index_includes.includes(pull_request: :user) + issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user)) + @all_issues = issues.distinct + @filter_issues = @all_issues + @filter_issues = @filter_issues.where("issues.subject LIKE ? OR issues.description LIKE ? ", "%#{params[:search]}%", "%#{params[:search]}%") if params[:search].present? + @open_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::OPEN}) + @close_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::CLOSED}) + @merged_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::MERGED}) @user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user)) @user_admin_or_developer = current_user.present? && (current_user.admin || @project.all_developers.include?(current_user)) - if @project.pr_view_admin? && !@project.manager?(current_user) - @open_issues = [] - @close_issues = [] - @merged_issues = [] - @issues_size = 0 - @issues = [] - else - issues = @project.issues.issue_pull_request.issue_index_includes.includes(pull_request: :user) - issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user)) - @all_issues = issues.distinct - @filter_issues = @all_issues - @filter_issues = @filter_issues.where("issues.subject LIKE ? OR issues.description LIKE ? ", "%#{params[:search]}%", "%#{params[:search]}%") if params[:search].present? - @open_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::OPEN}) - @close_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::CLOSED}) - @merged_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::MERGED}) - scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "PullRequest") - @issues_size = scopes.size - @issues = paginate(scopes) - end + scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "PullRequest") + @issues_size = scopes.size + @issues = paginate(scopes) end def new From f19dfc9d0897b301d7281f4ee146c71484a1f5c1 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 30 May 2023 17:59:40 +0800 Subject: [PATCH 024/233] =?UTF-8?q?PR=E6=95=B0=E6=8D=AE=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/repositories/edit.json.jbuilder | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/repositories/edit.json.jbuilder b/app/views/repositories/edit.json.jbuilder index e0b601f6d..7ef3c9081 100644 --- a/app/views/repositories/edit.json.jbuilder +++ b/app/views/repositories/edit.json.jbuilder @@ -10,7 +10,8 @@ json.project_units @project.project_units.pluck(:unit_type) json.lesson_url @project.lesson_url json.permission render_permission(current_user, @project) json.is_transfering @project.is_transfering -json.transfer do +json.pr_view_admin @project.pr_view_admin? +json.transfer do json.partial! "/users/user_simple", locals: {user: @project&.applied_transfer_project&.owner} end json.is_pinned @project.has_pinned_users.include?(current_user) \ No newline at end of file From 677f9c2f4ee5740f0aac4dc176f420b5b08fc480 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 1 Jun 2023 18:33:29 +0800 Subject: [PATCH 025/233] =?UTF-8?q?user=20list=E8=BF=94=E5=9B=9E=E8=84=B1?= =?UTF-8?q?=E6=95=8F=E6=89=8B=E6=9C=BA=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_user_small.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/users/_user_small.json.jbuilder b/app/views/users/_user_small.json.jbuilder index f5929ef6b..f495680e1 100644 --- a/app/views/users/_user_small.json.jbuilder +++ b/app/views/users/_user_small.json.jbuilder @@ -4,6 +4,7 @@ json.array! users do |user| json.login user.login json.user_id user.id json.mail user.mail + json.phone user.phone.present? ? "#{user.phone[0..2]}****#{user.phone[-4..-1]}" : "" json.custom_department user.custom_department json.image_url url_to_avatar(user) json.profile_completed user.profile_completed From 6d8956e80380d7c5ed21815c4ba0d4dadc08587f Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Mon, 5 Jun 2023 14:29:14 +0800 Subject: [PATCH 026/233] =?UTF-8?q?=E5=A4=8D=E6=9D=82=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/repositories_controller.rb | 6 +++--- app/services/gitea/client_service.rb | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 6b2d2437a..f981c37b5 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -74,7 +74,7 @@ class RepositoriesController < ApplicationController end def sub_entries - file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) + file_path_uri = URI.escape(URI.encode(params[:filepath].to_s.strip)) if @project.educoder? if params[:type] === 'file' @@ -127,7 +127,7 @@ class RepositoriesController < ApplicationController @commits = Educoder::Repository::Commits::ListService.call(@project&.project_educoder&.repo_name) else if params[:filepath].present? - file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) + file_path_uri = URI.escape(URI.encode(params[:filepath].to_s.strip)) @hash_commit = Gitea::Repository::Commits::FileListService.new(@owner.login, @project.identifier, file_path_uri, sha: params[:sha], page: params[:page], limit: params[:limit], token: @owner&.gitea_token).call else @@ -323,7 +323,7 @@ class RepositoriesController < ApplicationController # TODO 获取最新commit信息 def project_commits if params[:filepath].present? - file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) + file_path_uri = URI.escape(URI.encode(params[:filepath].to_s.strip)) Gitea::Repository::Commits::FileListService.new(@project.owner.login, @project.identifier, file_path_uri, sha: get_ref, page: 1, limit: 1, token: @project&.owner&.gitea_token).call else diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb index 62e040d82..5418be159 100644 --- a/app/services/gitea/client_service.rb +++ b/app/services/gitea/client_service.rb @@ -115,6 +115,9 @@ class Gitea::ClientService < ApplicationService url = [api_url(is_hat), api_rest].join('').freeze url = action === 'get' ? url : URI.escape(url) url = URI.escape(url) unless url.ascii_only? + url = url.gsub(")", "%29") if url.to_s.include?(")") + url = url.gsub("]", "%5D") if url.to_s.include?("]") + url = url.gsub("[", "%5B") if url.to_s.include?("[") puts "[gitea] request url: #{url}" return url end From f7162abe0d9cce38db0cb6258511dbcee6af2092 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Mon, 5 Jun 2023 14:47:14 +0800 Subject: [PATCH 027/233] =?UTF-8?q?fixed=20=E6=B3=A8=E5=86=8Cerror=20messa?= =?UTF-8?q?ge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/gitea/user/register_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/gitea/user/register_service.rb b/app/services/gitea/user/register_service.rb index f9e42e9e5..afea81080 100644 --- a/app/services/gitea/user/register_service.rb +++ b/app/services/gitea/user/register_service.rb @@ -31,7 +31,7 @@ class Gitea::User::RegisterService < Gitea::ClientService case status when 201 then success(body) else - error(message, status) + error(message || body["message"], status) end end From da299195a0ef52f58c64e7dd731a6f54d801d583 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Mon, 5 Jun 2023 14:59:59 +0800 Subject: [PATCH 028/233] =?UTF-8?q?fixed=20=E6=B3=A8=E5=86=8Cerror=20messa?= =?UTF-8?q?ge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 8e395b833..59823861f 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -162,7 +162,7 @@ class AccountsController < ApplicationController render_ok end else - tip_exception(-1, interactor.error) + tip_exception(-1, interactor.result[:message]) end rescue Register::BaseForm::EmailError => e render_result(-2, e.message) @@ -177,10 +177,13 @@ class AccountsController < ApplicationController rescue Register::BaseForm::VerifiCodeError => e render_result(-6, e.message) rescue Exception => e - Gitea::User::DeleteService.call(user.login) unless user.nil? - Rails.logger.error("##:register error--#{user.try(:id)}") + if user.present? && !e.message.to_s.include?("user already exists") + # Gitea::User::DeleteService.call(user.login) + # user.destroy + end + Rails.logger.error("##:register error--#{user.try(:id)},message:#{e.message}") logger_error(e) - tip_exception(-1, e.message) + tip_exception(-1, "注册失败") end end From a2ebf3dbd6900fa4c86d2b4a44d2772156d39d02 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Mon, 5 Jun 2023 16:05:01 +0800 Subject: [PATCH 029/233] =?UTF-8?q?fixed=20=E5=A4=8D=E6=9D=82=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E7=A7=B0=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/repositories_controller.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index f981c37b5..6b2d2437a 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -74,7 +74,7 @@ class RepositoriesController < ApplicationController end def sub_entries - file_path_uri = URI.escape(URI.encode(params[:filepath].to_s.strip)) + file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) if @project.educoder? if params[:type] === 'file' @@ -127,7 +127,7 @@ class RepositoriesController < ApplicationController @commits = Educoder::Repository::Commits::ListService.call(@project&.project_educoder&.repo_name) else if params[:filepath].present? - file_path_uri = URI.escape(URI.encode(params[:filepath].to_s.strip)) + file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) @hash_commit = Gitea::Repository::Commits::FileListService.new(@owner.login, @project.identifier, file_path_uri, sha: params[:sha], page: params[:page], limit: params[:limit], token: @owner&.gitea_token).call else @@ -323,7 +323,7 @@ class RepositoriesController < ApplicationController # TODO 获取最新commit信息 def project_commits if params[:filepath].present? - file_path_uri = URI.escape(URI.encode(params[:filepath].to_s.strip)) + file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip)) Gitea::Repository::Commits::FileListService.new(@project.owner.login, @project.identifier, file_path_uri, sha: get_ref, page: 1, limit: 1, token: @project&.owner&.gitea_token).call else From e90c79486a6eeedc7c96fe9effcf37c17d422958 Mon Sep 17 00:00:00 2001 From: chenjing Date: Tue, 6 Jun 2023 10:18:32 +0800 Subject: [PATCH 030/233] add github token for mirror --- app/controllers/projects_controller.rb | 2 +- app/forms/projects/migrate_form.rb | 2 +- app/models/repository.rb | 1 + app/models/user.rb | 29 +++++++++++++++----- app/services/projects/migrate_service.rb | 2 +- app/services/repositories/migrate_service.rb | 3 +- 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index fc56f1ca9..55c31918a 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -293,7 +293,7 @@ class ProjectsController < ApplicationController end def mirror_params - params.permit(:user_id, :name, :description, :repository_name, :is_mirror, :auth_username, + params.permit(:user_id, :name, :description, :repository_name, :is_mirror, :auth_username, :auth_token, :auth_password, :project_category_id, :project_language_id, :clone_addr, :private) end diff --git a/app/forms/projects/migrate_form.rb b/app/forms/projects/migrate_form.rb index 12a4ee617..98ebbc7ac 100644 --- a/app/forms/projects/migrate_form.rb +++ b/app/forms/projects/migrate_form.rb @@ -1,5 +1,5 @@ class Projects::MigrateForm < BaseForm - attr_accessor :user_id, :name, :repository_name, :project_category_id, :description, + attr_accessor :user_id, :name, :repository_name, :project_category_id, :description, :auth_token, :project_language_id, :clone_addr, :private, :is_mirror, :auth_username, :auth_password, :owner validates :user_id, :name, :repository_name, :clone_addr, presence: true diff --git a/app/models/repository.rb b/app/models/repository.rb index c60164001..ed1f81db3 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -43,6 +43,7 @@ class Repository < ApplicationRecord validates :identifier, presence: true delegate :default_branch, to: :project, allow_nil: true + attr_accessor :auth_token def to_param self.identifier.parameterize diff --git a/app/models/user.rb b/app/models/user.rb index 5e0ff12d7..9d76696ea 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -39,15 +39,14 @@ # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer -# is_shixun_marker :boolean default("0") -# admin_visitable :boolean default("0") -# collaborator :boolean default("0") +# platform :string(255) default("0") +# gitea_token :string(255) # gitea_uid :integer +# is_shixun_marker :boolean default("0") # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") -# gitea_token :string(255) -# platform :string(255) +# sign_cla :boolean default("0") # # Indexes # @@ -56,8 +55,7 @@ # index_users_on_homepage_teacher (homepage_teacher) # index_users_on_laboratory_id (laboratory_id) # index_users_on_login (login) UNIQUE -# index_users_on_mail (mail) UNIQUE -# index_users_on_phone (phone) UNIQUE +# index_users_on_mail (mail) # index_users_on_type (type) # @@ -463,6 +461,23 @@ class User < Owner end end + + def register_gitea + psd = "12345678" + interactor = Gitea::RegisterInteractor.call({username: self.login, email: self.mail, password: psd}) + if interactor.success? + gitea_user = interactor.result + result = Gitea::User::GenerateTokenService.call(self.login, psd) + self.gitea_token = result['sha1'] + self.gitea_uid = gitea_user[:body]['id'] + self.password = psd + self.password_confirmation = psd + if self.save! + UserExtension.create!(user_id: self.id) + end + end + end + def activate! update_attribute(:status, STATUS_ACTIVE) prohibit_gitea_user_login!(false) diff --git a/app/services/projects/migrate_service.rb b/app/services/projects/migrate_service.rb index 68ed9f642..f157ada1d 100644 --- a/app/services/projects/migrate_service.rb +++ b/app/services/projects/migrate_service.rb @@ -9,7 +9,6 @@ class Projects::MigrateService < ApplicationService def call raise Error, "user_id不正确." unless authroize_user_id_success - @project = Project.new(project_params) if @project.save! ProjectUnit.init_types(@project.id, project.project_type) @@ -55,6 +54,7 @@ class Projects::MigrateService < ApplicationService user_id: params[:user_id], login: params[:auth_username], password: params[:auth_password], + auth_token: params[:auth_token], is_mirror: params[:is_mirror], source_clone_url: params[:source_clone_url] } diff --git a/app/services/repositories/migrate_service.rb b/app/services/repositories/migrate_service.rb index 7cf1cb3e7..deb0e30d3 100644 --- a/app/services/repositories/migrate_service.rb +++ b/app/services/repositories/migrate_service.rb @@ -32,7 +32,8 @@ class Repositories::MigrateService < ApplicationService private: params[:hidden], mirror: wrapper_mirror || false, auth_username: params[:login], - auth_password: Base64.decode64(params[:password] || "") + auth_password: Base64.decode64(params[:password] || ""), + auth_token: params[:auth_token] } end From dc6b92c77464a081f094379eb359b2e740d40d26 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 6 Jun 2023 17:11:08 +0800 Subject: [PATCH 031/233] =?UTF-8?q?=E5=AF=BC=E8=88=AA=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=B8=BB=E9=A1=B5=E5=8E=BB=E6=8E=89=E5=9B=BA=E5=AE=9A=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/settings_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index def2e2c89..ecabeca21 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -14,10 +14,10 @@ class SettingsController < ApplicationController private def get_navbar @navbar = default_laboratory.navbar - if User.current.logged? - pernal_index = {"name"=>"个人主页", "link"=>get_site_url("url", "#{Rails.application.config_for(:configuration)['platform_url']}/current_user"), "hidden"=>false} - @navbar << pernal_index - end + # if User.current.logged? + # pernal_index = {"name"=>"个人主页", "link"=>get_site_url("url", "#{Rails.application.config_for(:configuration)['platform_url']}/current_user"), "hidden"=>false} + # @navbar << pernal_index + # end end def get_add_menu From 14da90d60199d7e34a86d41dc922fbc02737be06 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Tue, 6 Jun 2023 17:54:35 +0800 Subject: [PATCH 032/233] =?UTF-8?q?fixed=20=E6=9C=80=E5=90=8E=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=A2=9E=E5=8A=A0=E5=8F=82=E6=95=B0stat=E5=8A=A0?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/gitea/repository/commits/file_list_service.rb | 2 +- app/services/gitea/repository/commits/list_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/gitea/repository/commits/file_list_service.rb b/app/services/gitea/repository/commits/file_list_service.rb index 14c873fd3..b0bba7abe 100644 --- a/app/services/gitea/repository/commits/file_list_service.rb +++ b/app/services/gitea/repository/commits/file_list_service.rb @@ -20,7 +20,7 @@ class Gitea::Repository::Commits::FileListService < Gitea::ClientService private def params - {sha: args[:sha] || 'master', page: args[:page] || PAGINATE_DEFAULT_PAGE, limit: args[:limit] || PAGINATE_DEFAULT_LIMIT, token: args[:token] || "", stat: args[:page].to_i != 1 } + {sha: args[:sha] || 'master', page: args[:page] || PAGINATE_DEFAULT_PAGE, limit: args[:limit] || PAGINATE_DEFAULT_LIMIT, token: args[:token] || "", stat: args[:page].to_i != 1 && args[:limit] !=1 } end def url diff --git a/app/services/gitea/repository/commits/list_service.rb b/app/services/gitea/repository/commits/list_service.rb index 124cf544d..700508539 100644 --- a/app/services/gitea/repository/commits/list_service.rb +++ b/app/services/gitea/repository/commits/list_service.rb @@ -19,7 +19,7 @@ class Gitea::Repository::Commits::ListService < Gitea::ClientService private def params - { sha: args[:sha] || 'master', page: args[:page] || PAGINATE_DEFAULT_PAGE, limit: args[:limit] || PAGINATE_DEFAULT_LIMIT, token: args[:token] || "" } + { sha: args[:sha] || 'master', page: args[:page] || PAGINATE_DEFAULT_PAGE, limit: args[:limit] || PAGINATE_DEFAULT_LIMIT, token: args[:token] || "", stat: args[:page].to_i != 1 && args[:limit] !=1 } end def url From 8f51955bd7e80aead6b1f500a9efc5448aaf9050 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 10:54:36 +0800 Subject: [PATCH 033/233] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=94=A8=E6=88=B7for?= =?UTF-8?q?k=E8=87=AA=E5=B7=B1=E7=9A=84=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/forks_controller.rb | 4 ++-- app/services/gitea/repository/fork_service.rb | 7 +++++-- app/services/projects/fork_service.rb | 10 +++++++--- lib/tasks/batch_forked_project.rake | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index c740c8b03..53b043f49 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -5,12 +5,12 @@ class ForksController < ApplicationController before_action :authenticate_project!, :authenticate_user! def create - @new_project = Projects::ForkService.new(current_user, @project, params[:organization]).call + @new_project = Projects::ForkService.new(current_user, @project, params[:organization], params[:new_name], params[:new_identifier]).call end private def authenticate_project! - if current_user&.id == @project.user_id + if current_user&.id == @project.user_id && (params[:new_identifier].blank? || params[:new_identifier] == @project.identifier) render_result(-1, "自己不能fork自己的项目") elsif Project.exists?(user_id: current_user.id, identifier: @project.identifier) render_result(0, "fork失败,你已拥有了这个项目") diff --git a/app/services/gitea/repository/fork_service.rb b/app/services/gitea/repository/fork_service.rb index c43a9ddf2..ca0c0fe68 100644 --- a/app/services/gitea/repository/fork_service.rb +++ b/app/services/gitea/repository/fork_service.rb @@ -1,5 +1,5 @@ class Gitea::Repository::ForkService < Gitea::ClientService - attr_reader :old_owner, :target_owner, :repo_name, :organization + attr_reader :old_owner, :target_owner, :repo_name, :organization, :new_identifier # old_owner: 被clone的项目(源项目)拥有者 # target_owner: clone后的醒目(新项目)的拥有者 @@ -7,10 +7,12 @@ class Gitea::Repository::ForkService < Gitea::ClientService # { # "organization": "string" #组织名称 # } - def initialize(old_owner, target_owner, repo_name, organization=nil) + def initialize(old_owner, target_owner, repo_name, organization=nil, new_identifier=nil) @old_owner = old_owner @target_owner = target_owner @repo_name = repo_name + @organization = organization + @new_identifier = new_identifier end def call @@ -24,6 +26,7 @@ class Gitea::Repository::ForkService < Gitea::ClientService def request_params hash = Hash.new.merge(token: target_owner.gitea_token) hash = hash.merge(data: {organization: organization}) if organization + hash = hash.merge(data: {name: new_identifier}) if new_identifier hash end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index f8b38df47..3e6a153fb 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -1,10 +1,12 @@ class Projects::ForkService < ApplicationService - attr_reader :target_owner, :project, :organization + attr_reader :target_owner, :project, :organization, :new_name, :new_identifier - def initialize(target_owner, project, organization=nil) + def initialize(target_owner, project, organization=nil, new_name=nil, new_identifier=nil) @target_owner = target_owner @project = project @organization = organization + @new_name = new_name + @new_identifier = new_identifier end def call @@ -15,11 +17,13 @@ class Projects::ForkService < ApplicationService :rep_identifier, :project_category_id, :project_language_id, :license_id, :ignore_id, {repository: [:identifier, :hidden]}] - result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization).call + result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization, @new_identifier).call clone_project.owner = @target_owner clone_project.forked_from_project_id = @project.id clone_project.gpid = result['id'] + clone_project.name = @new_name if @new_name.present? + clone_project.identifier = @new_identifier if @new_identifier.present? clone_project.save! new_repository = clone_project.repository diff --git a/lib/tasks/batch_forked_project.rake b/lib/tasks/batch_forked_project.rake index 4cb50a77a..e0fea6f5b 100644 --- a/lib/tasks/batch_forked_project.rake +++ b/lib/tasks/batch_forked_project.rake @@ -15,7 +15,7 @@ namespace :batch_forked_project do user = User.find_by(login: username) next if user.blank? next if Project.exists?(user_id: user.id, identifier: project.identifier) - new_project = Projects::ForkService.new(user, project, nil).call + new_project = Projects::ForkService.new(user, project, nil, nil, nil).call random_num = rand(5..20) members = user_logins.sample(random_num) members.each do |m| From aad2db5c5bf55f31907e11d2bbe835ae2a44075e Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 11:03:49 +0800 Subject: [PATCH 034/233] =?UTF-8?q?=E7=A6=81=E6=AD=A2pr=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/pull_requests/index.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/pull_requests/index.json.jbuilder b/app/views/pull_requests/index.json.jbuilder index f231e5796..b7f642118 100644 --- a/app/views/pull_requests/index.json.jbuilder +++ b/app/views/pull_requests/index.json.jbuilder @@ -10,6 +10,7 @@ json.project_name @project.name json.project_author @project.owner.try(:login) json.project_author_name @project.owner.try(:show_real_name) json.has_created_pull_requests @project.pull_requests.size > 0 +json.disable_pr_vew @project.pr_view_admin? && !@project.manager?(current_user) json.issues do json.array! @issues.to_a do |issue| From a6fa3f9354e550a1c7121231c4fbb19e1ee7e33d Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 11:45:50 +0800 Subject: [PATCH 035/233] =?UTF-8?q?=E7=A6=81=E6=AD=A2pr=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/pull_requests/_merge_item.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/pull_requests/_merge_item.json.jbuilder b/app/views/pull_requests/_merge_item.json.jbuilder index 0db17e265..202530c0b 100644 --- a/app/views/pull_requests/_merge_item.json.jbuilder +++ b/app/views/pull_requests/_merge_item.json.jbuilder @@ -4,6 +4,7 @@ json.issue_versions @project_versions json.issue_priories @project_priories json.project_author @project.owner.try(:show_real_name) json.project_name @project.try(:name) +json.disable_pr_vew @project.pr_view_admin? && !@project.manager?(current_user) json.members do json.array! @project_members.to_a.each do |user| json.id user.id From d87a2fcd7eb8f5cf9b7dfd1fc421de1d79db1895 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 13:56:32 +0800 Subject: [PATCH 036/233] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=94=A8=E6=88=B7for?= =?UTF-8?q?k=E8=87=AA=E5=B7=B1=E7=9A=84=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/forks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index 53b043f49..7d7db9350 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -12,7 +12,7 @@ class ForksController < ApplicationController def authenticate_project! if current_user&.id == @project.user_id && (params[:new_identifier].blank? || params[:new_identifier] == @project.identifier) render_result(-1, "自己不能fork自己的项目") - elsif Project.exists?(user_id: current_user.id, identifier: @project.identifier) + elsif Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) render_result(0, "fork失败,你已拥有了这个项目") end # return if current_user != @project.owner From 80f9e1065d50923f05f073654e9b2b5c5631d104 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 14:16:22 +0800 Subject: [PATCH 037/233] =?UTF-8?q?=E6=B3=A8=E5=86=8Cerror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 59823861f..c40714c98 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -182,6 +182,7 @@ class AccountsController < ApplicationController # user.destroy end Rails.logger.error("##:register error--#{user.try(:id)},message:#{e.message}") + UserAction.create(:action_id => user.try(:id).to_i, :action_type => "register_error", :user_id => user.try(:id).to_i, :ip => "code: #{register_params[:code]}; login: #{register_params[:login]}; namespace: #{register_params[:namespace]}; password: #{password};") logger_error(e) tip_exception(-1, "注册失败") end From 63824eaa8bd04e7ba2b3e14768367ab7ab5fe15c Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 14:26:19 +0800 Subject: [PATCH 038/233] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index c40714c98..320ca05e2 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -161,6 +161,9 @@ class AccountsController < ApplicationController successful_authentication(user) render_ok end + elsif interactor.result[:message].to_s.include?("user already exists") + UserAction.create(:action_id => 2, :action_type => "register_error", :user_id => user.try(:id).to_i, :ip => "code: #{register_params[:code]}; login: #{register_params[:login]}; namespace: #{register_params[:namespace]}; password: #{password};") + normal_status(-1, "用户已注册,请勿连续操作。") else tip_exception(-1, interactor.result[:message]) end @@ -182,7 +185,7 @@ class AccountsController < ApplicationController # user.destroy end Rails.logger.error("##:register error--#{user.try(:id)},message:#{e.message}") - UserAction.create(:action_id => user.try(:id).to_i, :action_type => "register_error", :user_id => user.try(:id).to_i, :ip => "code: #{register_params[:code]}; login: #{register_params[:login]}; namespace: #{register_params[:namespace]}; password: #{password};") + UserAction.create(:action_id => 1, :action_type => "register_error", :user_id => user.try(:id).to_i, :ip => "code: #{register_params[:code]}; login: #{register_params[:login]}; namespace: #{register_params[:namespace]}; password: #{password};") logger_error(e) tip_exception(-1, "注册失败") end From 471de1dc07f03aa9fbb7e23e24867c65b38fa096 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 14:32:29 +0800 Subject: [PATCH 039/233] =?UTF-8?q?=E5=8F=96=E6=B6=88=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E8=B5=84=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 9d76696ea..dcd13b8ed 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -853,7 +853,8 @@ class User < Owner end def profile_is_completed? - self.nickname.present? && self.mail.present? + # self.nickname.present? && self.mail.present? + true end def trace_token From b8807d60093e887f59b5cc6f4a94d54067193d23 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 14:52:03 +0800 Subject: [PATCH 040/233] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E4=BB=85=E6=98=BE=E7=A4=BA=E5=85=AC=E5=BC=80=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=8A=A8=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users/project_trends_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/users/project_trends_controller.rb b/app/controllers/users/project_trends_controller.rb index 9edd56f18..a1b62589f 100644 --- a/app/controllers/users/project_trends_controller.rb +++ b/app/controllers/users/project_trends_controller.rb @@ -6,6 +6,7 @@ class Users::ProjectTrendsController < Users::BaseController else @project_trends = observed_user.project_trends end + @project_trends = @project_trends.joins(:project).where("projects.is_public = TRUE") @project_trends = kaminari_paginate(@project_trends.includes(:trend, :project).order(created_at: :desc)) end end \ No newline at end of file From 4591ef2df34be94d9b093bbc9c4f027cb35db45d Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 14:55:17 +0800 Subject: [PATCH 041/233] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E4=BB=85=E6=98=BE=E7=A4=BA=E5=85=AC=E5=BC=80=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=8A=A8=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users/project_trends_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/users/project_trends_controller.rb b/app/controllers/users/project_trends_controller.rb index a1b62589f..5c636f63b 100644 --- a/app/controllers/users/project_trends_controller.rb +++ b/app/controllers/users/project_trends_controller.rb @@ -6,7 +6,7 @@ class Users::ProjectTrendsController < Users::BaseController else @project_trends = observed_user.project_trends end - @project_trends = @project_trends.joins(:project).where("projects.is_public = TRUE") + @project_trends = @project_trends.left_joins(:project).where("projects.is_public = TRUE") @project_trends = kaminari_paginate(@project_trends.includes(:trend, :project).order(created_at: :desc)) end end \ No newline at end of file From 6f33016a7831e63bdfd8babd25184261b78fa006 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 16:31:08 +0800 Subject: [PATCH 042/233] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/gitea/repository/migrate_service.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/services/gitea/repository/migrate_service.rb b/app/services/gitea/repository/migrate_service.rb index ab60b42f3..c605df0bb 100644 --- a/app/services/gitea/repository/migrate_service.rb +++ b/app/services/gitea/repository/migrate_service.rb @@ -34,6 +34,9 @@ class Gitea::Repository::MigrateService < Gitea::ClientService response = post(url, request_params) render_response(response) + rescue => e + puts "MigrateService error: #{e.message}" + [500, e.message, ""] end private From f1ab52da5c74f5af965e7681f9d157834fc154f8 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 11:25:03 +0800 Subject: [PATCH 043/233] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E9=99=90=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 19 +++++++++++- app/controllers/projects_controller.rb | 36 ++++++++++++----------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 186ee874f..be17a4370 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1161,6 +1161,23 @@ class ApplicationController < ActionController::Base end def find_atme_receivers @atme_receivers = User.where(login: params[:receivers_login]) - end + end + + # 接口限流,请求量大有性能问题 + def request_limit + begin + record_count = Rails.cache.read("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}") + if record_count.present? + record_count = record_count + 1 + else + record_count = 1 + end + tip_exception("非法请求") if record_count > 100 + + Rails.cache.write("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}", record_count, expires_in: 1.minute) + rescue + + end + end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 55c31918a..bcbe031b6 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -9,6 +9,7 @@ class ProjectsController < ApplicationController before_action :load_repository, except: %i[index group_type_list migrate create recommend banner_recommend] before_action :authorizate_user_can_edit_project!, only: %i[update] before_action :project_public?, only: %i[fork_users praise_users watch_users] + before_action :request_limit, only: %i[index] def menu_list menu = [] @@ -42,11 +43,11 @@ class ProjectsController < ApplicationController if category_id.blank? && params[:search].blank? && params[:topic_id].blank? # 默认查询时count性能问题处理 ProjectCategory.sum("projects_count") - Project.visible.joins("left join organization_extensions on organization_extensions.organization_id = projects.user_id").where("organization_extensions.visibility =2").count - elsif params[:search].present? || params[:topic_id].present? + elsif params[:search].present? || params[:topic_id].present? @projects.total_count else - cate = ProjectCategory.find_by(id: category_id) - cate&.projects_count || 0 + cate = ProjectCategory.find_by(id: category_id) + cate&.projects_count || 0 end end @@ -64,16 +65,16 @@ class ProjectsController < ApplicationController def migrate Projects::MigrateForm.new(mirror_params).validate! - @project = + @project = if EduSetting.get("mirror_address").to_s.include?("github") && enable_accelerator?(mirror_params[:clone_addr]) source_clone_url = mirror_params[:clone_addr] uid_logger("########## 已动加速器 ##########") result = Gitea::Accelerator::MigrateService.call(mirror_params) if result[:status] == :success Rails.logger.info "########## 加速镜像成功 ########## " - Projects::MigrateService.call(current_user, - mirror_params.merge(source_clone_url: source_clone_url, - clone_addr: accelerator_url(mirror_params[:repository_name]))) + Projects::MigrateService.call(current_user, + mirror_params.merge(source_clone_url: source_clone_url, + clone_addr: accelerator_url(mirror_params[:repository_name]))) else Projects::MigrateService.call(current_user, mirror_params) end @@ -95,7 +96,7 @@ class ProjectsController < ApplicationController # result = Gitea::Repository::Branches::ListService.call(@owner, @project.identifier) result = Gitea::Repository::Branches::ListNameService.call(@owner, @project.identifier, params[:name]) - @branches = result.is_a?(Hash) ? (result.key?(:status) ? [] : result) : result + @branches = result.is_a?(Hash) ? (result.key?(:status) ? [] : result) : result end def branches_slice @@ -129,7 +130,7 @@ class ProjectsController < ApplicationController ActiveRecord::Base.transaction do # TODO: # 临时特殊处理修改website、lesson_url操作方法 - if project_params.has_key?("website") + if project_params.has_key?("website") if params[:project_topic_names].is_a?(Array) ProjectTopicRalate.where(project: @project).destroy_all params[:project_topic_names].each do |name| @@ -145,11 +146,11 @@ class ProjectsController < ApplicationController } Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params) else - validate_params = project_params.slice(:name, :description, - :project_category_id, :project_language_id, :private, :identifier) - + validate_params = project_params.slice(:name, :description, + :project_category_id, :project_language_id, :private, :identifier) + Projects::UpdateForm.new(validate_params.merge(user_id: @project.user_id, project_identifier: @project.identifier, project_name: @project.name)).validate! - + private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : params[:private] || false new_project_params = project_params.except(:private).merge(is_public: !private) @@ -162,7 +163,7 @@ class ProjectsController < ApplicationController name: @project.identifier } gitea_repo = Gitea::Repository::UpdateService.call(@owner, @project&.repository&.identifier, gitea_params) - @project.repository.update_attributes({hidden: gitea_repo["private"], identifier: gitea_repo["name"]}) + @project.repository.update_attributes({ hidden: gitea_repo["private"], identifier: gitea_repo["name"] }) # 更新对应所属分类下的项目数量(私有) before_is_public = @project.previous_changes[:is_public].present? ? @project.previous_changes[:is_public][0] : @project.is_public after_is_public = @project.previous_changes[:is_public].present? ? @project.previous_changes[:is_public][1] : @project.is_public @@ -203,13 +204,13 @@ class ProjectsController < ApplicationController def quit user_is_admin = current_user.admin? || @project.manager?(current_user) - if !user_is_admin && @project.member(current_user.id) && @project.forge? + if !user_is_admin && @project.member(current_user.id) && @project.forge? ActiveRecord::Base.transaction do Projects::DeleteMemberInteractor.call(@project.owner, @project, current_user) SendTemplateMessageJob.perform_later('ProjectMemberLeft', current_user.id, current_user.id, @project.id) if Site.has_notice_menu? render_ok end - else + else render_forbidden('你不能退出该仓库') end rescue Exception => e @@ -273,7 +274,7 @@ class ProjectsController < ApplicationController if @project_detail.save! attachment_ids = Array(params[:attachment_ids]) logger.info "=============> #{Array(params[:attachment_ids])}" - @attachments = Attachment.where(id: attachment_ids) + @attachments = Attachment.where(id: attachment_ids) @attachments.update_all( container_id: @project_detail.id, container_type: @project_detail.model_name.name, @@ -286,6 +287,7 @@ class ProjectsController < ApplicationController private + def project_params params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url, :default_branch, :identifier, :project_category_id, :project_language_id, :license_id, :ignore_id, :private, From 9f40886c45f15bfbfc757fdfebb2ee25b0363c69 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 13:58:07 +0800 Subject: [PATCH 044/233] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E9=99=90=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index be17a4370..d29d6d798 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1172,7 +1172,7 @@ class ApplicationController < ActionController::Base else record_count = 1 end - tip_exception("非法请求") if record_count > 100 + normal_status("请求太快,请稍后再试。") if record_count > 100 Rails.cache.write("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}", record_count, expires_in: 1.minute) rescue From 18a48337595af73300796474f7e627a5f9e505fd Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 14:00:06 +0800 Subject: [PATCH 045/233] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E9=99=90=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d29d6d798..5dc043a81 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1165,19 +1165,15 @@ class ApplicationController < ActionController::Base # 接口限流,请求量大有性能问题 def request_limit - begin - record_count = Rails.cache.read("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}") - if record_count.present? - record_count = record_count + 1 - else - record_count = 1 - end - normal_status("请求太快,请稍后再试。") if record_count > 100 - - Rails.cache.write("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}", record_count, expires_in: 1.minute) - rescue - + record_count = Rails.cache.read("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}") + if record_count.present? + record_count = record_count + 1 + else + record_count = 1 end + tip_exception("请求太快,请稍后再试。") if record_count > 100 + + Rails.cache.write("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}", record_count, expires_in: 1.minute) end end From 74de1cf78fcf26346a5fc394dcef7cb5177fd3b1 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 15:55:56 +0800 Subject: [PATCH 046/233] =?UTF-8?q?fixed=20=E7=BB=84=E7=BB=87=E5=A4=9A?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=A4=E6=96=AD=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/organization.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/models/organization.rb b/app/models/organization.rb index 75a2db971..baf85fc03 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -126,14 +126,24 @@ class Organization < Owner def is_only_admin?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(admin)}).present? + roles = has_roles(user_id) + roles.size > 1 ? false : roles.include?("admin") end def is_only_write?(user_id) - team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(write)}).present? + # team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(write)}).present? + roles = has_roles(user_id) + roles.size > 1 ? false : roles.include?("write") end def is_only_read?(user_id) - team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(read)}).present? + # team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(read)}).present? + roles = has_roles(user_id) + roles.size > 1 ? false : roles.include?("read") + end + + def has_roles(user_id) + teams.joins(:team_users).where("team_users.user_id=?", user_id).pluck("teams.authorize").uniq end # 是不是所有者团队的最后一个成员 From 68be385af0a5e51f39edafd6d4b404f6893c0614 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 16:07:01 +0800 Subject: [PATCH 047/233] =?UTF-8?q?fixed=20=E7=BB=84=E7=BB=87=E5=A4=9A?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=A4=E6=96=AD=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/concerns/project_operable.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb index 4fee9ea33..9a5efd129 100644 --- a/app/models/concerns/project_operable.rb +++ b/app/models/concerns/project_operable.rb @@ -200,7 +200,7 @@ module ProjectOperable if owner.is_a?(User) managers.exists?(user_id: user.id) || (user.platform == "bot" && BotInstall.joins(:bot).where(bot: { uid: user.id }).where(store_id: self.id).exists?) elsif owner.is_a?(Organization) - managers.exists?(user_id: user.id) || owner.is_owner?(user.id) || (owner.is_only_admin?(user.id) && (teams.pluck(:id) & user.teams.pluck(:id)).size > 0) || (user.platform == "bot" && BotInstall.joins(:bot).where(bot: { uid: user.id }).where(store_id: self.id).exists?) + managers.exists?(user_id: user.id) || owner.is_owner?(user.id) || (owner.is_admin?(user.id) && (teams.pluck(:id) & user.teams.pluck(:id)).size > 0) || (user.platform == "bot" && BotInstall.joins(:bot).where(bot: { uid: user.id }).where(store_id: self.id).exists?) else false end @@ -212,7 +212,7 @@ module ProjectOperable if owner.is_a?(User) developers.exists?(user_id: user.id) || (user.platform == "bot" && BotInstall.joins(:bot).where(bot: { uid: user.id }).where(store_id: self.id).exists?) elsif owner.is_a?(Organization) - developers.exists?(user_id: user.id) || (owner.is_only_write?(user.id) && (teams.pluck(:id) & user.teams.pluck(:id)).size > 0) || (user.platform == "bot" && BotInstall.joins(:bot).where(bot: { uid: user.id }).where(store_id: self.id).exists?) + developers.exists?(user_id: user.id) || (owner.is_write?(user.id) && (teams.pluck(:id) & user.teams.pluck(:id)).size > 0) || (user.platform == "bot" && BotInstall.joins(:bot).where(bot: { uid: user.id }).where(store_id: self.id).exists?) else false end From 289e024253656ed3fd2a360607044d1393788146 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 16:49:35 +0800 Subject: [PATCH 048/233] =?UTF-8?q?fixed=20=E6=96=B0=E5=BB=BA=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 1 + app/jobs/migrate_remote_repository_job.rb | 1 + app/jobs/update_project_topic_job.rb | 32 +++++++++++++++++++++++ lib/tasks/init_project_topic.rake | 2 +- 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 app/jobs/update_project_topic_job.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index bcbe031b6..550716eaa 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -56,6 +56,7 @@ class ProjectsController < ApplicationController Projects::CreateForm.new(project_params).validate! @project = Projects::CreateService.new(current_user, project_params).call OpenProjectDevOpsJob.set(wait: 5.seconds).perform_later(@project&.id, current_user.id) + UpdateProjectTopicJob.set(wait: 5.seconds).perform_later(@project.id) if @project.id.present? end rescue Exception => e uid_logger_error(e.message) diff --git a/app/jobs/migrate_remote_repository_job.rb b/app/jobs/migrate_remote_repository_job.rb index 696607ae3..428f9a726 100644 --- a/app/jobs/migrate_remote_repository_job.rb +++ b/app/jobs/migrate_remote_repository_job.rb @@ -16,6 +16,7 @@ class MigrateRemoteRepositoryJob < ApplicationJob project_id = repo&.project&.id puts "############ mirror project_id,user_id: #{project_id},#{user_id} ############" OpenProjectDevOpsJob.set(wait: 5.seconds).perform_later(project_id, user_id) if project_id.present? && user_id.present? + UpdateProjectTopicJob.set(wait: 5.seconds).perform_later(project_id) if project_id.present? puts "############ mirror status: #{repo.mirror.status} ############" else repo&.mirror&.failed! diff --git a/app/jobs/update_project_topic_job.rb b/app/jobs/update_project_topic_job.rb new file mode 100644 index 000000000..dfa485ff5 --- /dev/null +++ b/app/jobs/update_project_topic_job.rb @@ -0,0 +1,32 @@ +class UpdateProjectTopicJob < ApplicationJob + include ProjectsHelper + + queue_as :message + + def perform(project_id) + project = Project.find_by(id: project_id) + return if project.blank? + begin + languages = $gitea_client.get_repos_languages_by_owner_repo(project.owner.login, project.identifier) + topic_count = 0 + if project.project_category_id.present? + project_topic = ProjectTopic.find_or_create_by!(name: project.project_category.name.downcase) + project_topic_ralate = project_topic.project_topic_ralates.find_or_create_by!(project_id: project.id) + if project_topic.present? && project_topic_ralate.present? + topic_count +=1 + end + end + languages.each do |k, _| + next if topic_count >= 3 + project_topic = ProjectTopic.find_or_create_by!(name: k.downcase) + project_topic_ralate = project_topic.project_topic_ralates.find_or_create_by!(project_id: project.id) + if project_topic.present? && project_topic_ralate.present? + topic_count +=1 + end + end + rescue + + end + end + +end \ No newline at end of file diff --git a/lib/tasks/init_project_topic.rake b/lib/tasks/init_project_topic.rake index f6fcd4b96..5255a4aa2 100644 --- a/lib/tasks/init_project_topic.rake +++ b/lib/tasks/init_project_topic.rake @@ -4,7 +4,7 @@ namespace :init_project_topic do desc "Init Project Topic for Project" task project: :environment do - Project.order(created_at: :desc).find_each do |p| + Project.where(platform: 'forge').order(created_at: :desc).find_each do |p| next unless p.owner.present? next if p.project_topics.size >= 3 begin From c7b61775c27f40a9ee5fccea374b3b4b1e518acf Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 17:05:48 +0800 Subject: [PATCH 049/233] =?UTF-8?q?fixed=20=E6=96=B0=E5=BB=BA=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 550716eaa..0d7caba05 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -56,7 +56,7 @@ class ProjectsController < ApplicationController Projects::CreateForm.new(project_params).validate! @project = Projects::CreateService.new(current_user, project_params).call OpenProjectDevOpsJob.set(wait: 5.seconds).perform_later(@project&.id, current_user.id) - UpdateProjectTopicJob.set(wait: 5.seconds).perform_later(@project.id) if @project.id.present? + UpdateProjectTopicJob.perform_later(@project.id) if @project.id.present? end rescue Exception => e uid_logger_error(e.message) From cf4b5e9ab8f54860ea8b3a8145718aa6d422d532 Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 17:08:58 +0800 Subject: [PATCH 050/233] =?UTF-8?q?fixed=20=E6=96=B0=E5=BB=BA=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E4=B8=8D=E5=BB=B6=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/migrate_remote_repository_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/migrate_remote_repository_job.rb b/app/jobs/migrate_remote_repository_job.rb index 428f9a726..73228aa20 100644 --- a/app/jobs/migrate_remote_repository_job.rb +++ b/app/jobs/migrate_remote_repository_job.rb @@ -16,7 +16,7 @@ class MigrateRemoteRepositoryJob < ApplicationJob project_id = repo&.project&.id puts "############ mirror project_id,user_id: #{project_id},#{user_id} ############" OpenProjectDevOpsJob.set(wait: 5.seconds).perform_later(project_id, user_id) if project_id.present? && user_id.present? - UpdateProjectTopicJob.set(wait: 5.seconds).perform_later(project_id) if project_id.present? + UpdateProjectTopicJob.perform_later(project_id) if project_id.present? puts "############ mirror status: #{repo.mirror.status} ############" else repo&.mirror&.failed! From 52cefc5a5144e9182c4502dd68fd9e2491d6b08d Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 17:16:01 +0800 Subject: [PATCH 051/233] =?UTF-8?q?fixed=20=E6=96=B0=E5=BB=BA=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E4=B8=8D=E5=BB=B6=E6=97=B6=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/update_project_topic_job.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/jobs/update_project_topic_job.rb b/app/jobs/update_project_topic_job.rb index dfa485ff5..52341d672 100644 --- a/app/jobs/update_project_topic_job.rb +++ b/app/jobs/update_project_topic_job.rb @@ -8,6 +8,7 @@ class UpdateProjectTopicJob < ApplicationJob return if project.blank? begin languages = $gitea_client.get_repos_languages_by_owner_repo(project.owner.login, project.identifier) + puts "#{project.owner.login}/#{project.identifier} get_repos_languages:#{languages}" topic_count = 0 if project.project_category_id.present? project_topic = ProjectTopic.find_or_create_by!(name: project.project_category.name.downcase) @@ -24,8 +25,8 @@ class UpdateProjectTopicJob < ApplicationJob topic_count +=1 end end - rescue - + rescue => e + puts "get_repos_languages: error:#{e.message}" end end From 635ca7ca4be5fe61b3124b09fbdc3b99d000a57b Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 17:18:48 +0800 Subject: [PATCH 052/233] =?UTF-8?q?fixed=20=E6=96=B0=E5=BB=BA=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E7=AD=BE,=E8=AF=AD=E8=A8=80=E8=8E=B7=E5=8F=96=E5=BF=85?= =?UTF-8?q?=E9=9C=80=E5=BB=B6=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/migrate_remote_repository_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/migrate_remote_repository_job.rb b/app/jobs/migrate_remote_repository_job.rb index 73228aa20..16f86e6ac 100644 --- a/app/jobs/migrate_remote_repository_job.rb +++ b/app/jobs/migrate_remote_repository_job.rb @@ -16,7 +16,7 @@ class MigrateRemoteRepositoryJob < ApplicationJob project_id = repo&.project&.id puts "############ mirror project_id,user_id: #{project_id},#{user_id} ############" OpenProjectDevOpsJob.set(wait: 5.seconds).perform_later(project_id, user_id) if project_id.present? && user_id.present? - UpdateProjectTopicJob.perform_later(project_id) if project_id.present? + UpdateProjectTopicJob.set(wait: 1.seconds).perform_later(project_id) if project_id.present? puts "############ mirror status: #{repo.mirror.status} ############" else repo&.mirror&.failed! From 7bebe42c49a13ba7e77353d420fa7463051e509e Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Thu, 8 Jun 2023 17:28:09 +0800 Subject: [PATCH 053/233] =?UTF-8?q?fixed=20=E5=B1=9E=E6=80=A7=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index dcd13b8ed..3c8795bc0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -877,7 +877,7 @@ class User < Owner # 重写gitea_token,当用户为bot类型时,替换成管理员token def gitea_token - if self.platform == "bot" + if self.respond_to?('platform') && self.platform == "bot" GiteaService.gitea_config[:admin_token] else self['gitea_token'] From 8be1373bf900ab3d28e26876dce719f709f9b262 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 8 Jun 2023 17:54:32 +0800 Subject: [PATCH 054/233] =?UTF-8?q?fixed=20=E5=B1=9E=E6=80=A7=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 3c8795bc0..90893defd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -853,8 +853,8 @@ class User < Owner end def profile_is_completed? - # self.nickname.present? && self.mail.present? - true + #self.nickname.present? && self.mail.present? + self.mail.present? end def trace_token From caa5ad5ac4af5a2a21ea579cb362d4ad1758a0b9 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 8 Jun 2023 18:01:44 +0800 Subject: [PATCH 055/233] =?UTF-8?q?fixed=20=E6=96=B0=E5=BB=BA=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E7=AD=BE,=E8=AF=AD=E8=A8=80=E8=8E=B7=E5=8F=96=E5=BF=85?= =?UTF-8?q?=E9=9C=80=E5=BB=B6=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/migrate_remote_repository_job.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/jobs/migrate_remote_repository_job.rb b/app/jobs/migrate_remote_repository_job.rb index 16f86e6ac..2493bff01 100644 --- a/app/jobs/migrate_remote_repository_job.rb +++ b/app/jobs/migrate_remote_repository_job.rb @@ -21,6 +21,7 @@ class MigrateRemoteRepositoryJob < ApplicationJob else repo&.mirror&.failed! end - BroadcastMirrorRepoMsgJob.perform_later(repo.id) unless repo&.mirror.waiting? + # UpdateProjectTopicJob 中语言要延迟1S才能获取 + BroadcastMirrorRepoMsgJob.set(wait: 1.seconds).perform_later(repo.id) unless repo&.mirror.waiting? end end From 66004f34571bcf7ec8740109a37e4cad334686e8 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Fri, 9 Jun 2023 09:39:07 +0800 Subject: [PATCH 056/233] gitea-hat-client log --- config/initializers/gitea_client.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/gitea_client.rb b/config/initializers/gitea_client.rb index 15777ac30..9a490fbb5 100644 --- a/config/initializers/gitea_client.rb +++ b/config/initializers/gitea_client.rb @@ -16,5 +16,5 @@ $gitea_hat_client = Gitea::Api::Hat::Client.new({ hat_base_url: gitea_config[:hat_base_url], username: gitea_config[:access_key_id], password: gitea_config[:access_key_secret], - log_filepath: "log/gitea-client.log" + log_filepath: "log/gitea-hat-client.log" }) \ No newline at end of file From b4a5f685be84c8c4f1cde2123785a4e75d0ef2c7 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Mon, 12 Jun 2023 17:49:32 +0800 Subject: [PATCH 057/233] =?UTF-8?q?fixed=20=E5=8F=91=E9=80=81=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/send_template_message_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/send_template_message_job.rb b/app/jobs/send_template_message_job.rb index 05572d451..1df1d8c7d 100644 --- a/app/jobs/send_template_message_job.rb +++ b/app/jobs/send_template_message_job.rb @@ -8,7 +8,7 @@ class SendTemplateMessageJob < ApplicationJob receivers_id, template_id, props = args[0], args[1], args[2] template = MessageTemplate.find_by_id(template_id) return unless template.present? - receivers = User.where(id: receivers_id).or(User.where(mail: receivers_id)) + receivers = User.where("id in(?)", receivers_id).or(User.where(mail: receivers_id)) not_exists_receivers = receivers_id - receivers.pluck(:id) - receivers.pluck(:mail) receivers_string, content, notification_url = MessageTemplate::CustomTip.get_message_content(receivers, template, props) Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {receivers_id: receivers_id, template_id: template_id, props: props}) From cfaa5301ea40635813bd2164741c3de806bff7c5 Mon Sep 17 00:00:00 2001 From: chenjing Date: Tue, 13 Jun 2023 15:30:16 +0800 Subject: [PATCH 058/233] cla init --- .../javascripts/admins/organizations/index.js | 43 +++++++++++ app/assets/javascripts/organizations/clas.js | 2 + app/assets/javascripts/users/clas.js | 2 + .../stylesheets/organizations/clas.scss | 3 + app/assets/stylesheets/users/clas.scss | 3 + .../admins/message_templates_controller.rb | 2 +- .../admins/organizations_controller.rb | 13 ++++ .../organizations/clas_controller.rb | 63 +++++++++++++++ app/controllers/users/clas_controller.rb | 22 ++++++ app/forms/organizations/create_cla_form.rb | 6 ++ app/forms/users/user_cla_form.rb | 6 ++ app/helpers/organizations/clas_helper.rb | 2 + app/helpers/users/clas_helper.rb | 2 + app/models/attachment.rb | 77 ++++++++++--------- app/models/ci/user.rb | 13 ++-- app/models/cla.rb | 38 +++++++++ app/models/commit_log.rb | 23 ++++++ app/models/edu_setting.rb | 31 ++++---- app/models/gitea/public_key.rb | 22 ++++++ app/models/gitea/pull.rb | 2 + app/models/gitea/webhook.rb | 31 +++++++- app/models/gitea/webhook_task.rb | 18 ++++- app/models/issue.rb | 3 +- app/models/issue_participant.rb | 17 ++++ app/models/issue_tag.rb | 23 +++--- app/models/laboratory.rb | 1 - app/models/mark_file.rb | 20 +++++ .../message_template/issue_creator_expire.rb | 16 +++- app/models/organization.rb | 24 ++++-- app/models/organization_extension.rb | 2 + app/models/praise_tread.rb | 33 ++++---- app/models/project.rb | 5 +- app/models/repository.rb | 1 + app/models/system_notification_history.rb | 14 ++-- app/models/template_message_setting.rb | 6 +- .../create_or_assign.rb | 6 +- .../manage_project.rb | 6 +- app/models/template_message_setting/normal.rb | 6 +- .../template_message_setting/watch_project.rb | 6 +- app/models/timeable_visit_record.rb | 2 +- app/models/token.rb | 31 ++++---- app/models/topic.rb | 1 - app/models/topic/activity_forum.rb | 1 - app/models/topic/banner.rb | 1 - app/models/topic/card.rb | 1 - app/models/topic/cooperator.rb | 1 - app/models/topic/excellent_project.rb | 1 - app/models/topic/experience_forum.rb | 1 - app/models/topic/glcc_news.rb | 3 +- app/models/topic/pinned_forum.rb | 1 - app/models/user.rb | 5 ++ app/models/user_action.rb | 7 +- app/models/user_agent.rb | 5 +- app/models/user_cla.rb | 35 +++++++++ app/models/user_extension.rb | 2 +- app/models/version.rb | 2 +- app/models/version_release.rb | 4 +- .../organizations/shared/_org_list.html.erb | 3 +- app/views/admins/organizations/show.html.erb | 3 + .../organizations/clas/_detail.json.jbuilder | 5 ++ .../organizations/clas/create.json.jbuilder | 1 + .../organizations/clas/index.json.jbuilder | 4 + .../organizations/clas/show.json.jbuilder | 6 ++ .../organizations/clas/update.json.jbuilder | 1 + .../organizations/_detail.json.jbuilder | 3 +- app/views/users/clas/_detail.json.jbuilder | 8 ++ app/views/users/clas/index.json.jbuilder | 3 + app/views/users/clas/show.json.jbuilder | 1 + config/routes.rb | 10 ++- db/migrate/20230612020506_add_cla_to_users.rb | 5 ++ db/migrate/20230612031416_create_clas.rb | 13 ++++ db/migrate/20230612031448_create_user_clas.rb | 12 +++ .../organizations/clas_controller_spec.rb | 5 ++ .../controllers/users/clas_controller_spec.rb | 5 ++ .../helpers/organizations/clas_helper_spec.rb | 15 ++++ spec/helpers/users/clas_helper_spec.rb | 15 ++++ spec/models/cla_spec.rb | 5 ++ spec/models/user_cla_spec.rb | 5 ++ 78 files changed, 682 insertions(+), 163 deletions(-) create mode 100644 app/assets/javascripts/admins/organizations/index.js create mode 100644 app/assets/javascripts/organizations/clas.js create mode 100644 app/assets/javascripts/users/clas.js create mode 100644 app/assets/stylesheets/organizations/clas.scss create mode 100644 app/assets/stylesheets/users/clas.scss create mode 100644 app/controllers/organizations/clas_controller.rb create mode 100644 app/controllers/users/clas_controller.rb create mode 100644 app/forms/organizations/create_cla_form.rb create mode 100644 app/forms/users/user_cla_form.rb create mode 100644 app/helpers/organizations/clas_helper.rb create mode 100644 app/helpers/users/clas_helper.rb create mode 100644 app/models/cla.rb create mode 100644 app/models/user_cla.rb create mode 100644 app/views/organizations/clas/_detail.json.jbuilder create mode 100644 app/views/organizations/clas/create.json.jbuilder create mode 100644 app/views/organizations/clas/index.json.jbuilder create mode 100644 app/views/organizations/clas/show.json.jbuilder create mode 100644 app/views/organizations/clas/update.json.jbuilder create mode 100644 app/views/users/clas/_detail.json.jbuilder create mode 100644 app/views/users/clas/index.json.jbuilder create mode 100644 app/views/users/clas/show.json.jbuilder create mode 100644 db/migrate/20230612020506_add_cla_to_users.rb create mode 100644 db/migrate/20230612031416_create_clas.rb create mode 100644 db/migrate/20230612031448_create_user_clas.rb create mode 100644 spec/controllers/organizations/clas_controller_spec.rb create mode 100644 spec/controllers/users/clas_controller_spec.rb create mode 100644 spec/helpers/organizations/clas_helper_spec.rb create mode 100644 spec/helpers/users/clas_helper_spec.rb create mode 100644 spec/models/cla_spec.rb create mode 100644 spec/models/user_cla_spec.rb diff --git a/app/assets/javascripts/admins/organizations/index.js b/app/assets/javascripts/admins/organizations/index.js new file mode 100644 index 000000000..b301e537d --- /dev/null +++ b/app/assets/javascripts/admins/organizations/index.js @@ -0,0 +1,43 @@ +$(document).on('turbolinks:load', function(){ + if ($('body.admins-organizations-index-page').length > 0) { + var showSuccessNotify = function() { + $.notify({ + message: '操作成功' + },{ + type: 'success' + }); + } + + // organizations open cla + $('.organizations-list-container').on('click', '.open-cla-action', function(){ + var $action = $(this); + + var userId = $action.data('id'); + $.ajax({ + url: '/admins/organizations/' + userId + '/open_cla', + method: 'POST', + dataType: 'json', + success: function() { + showSuccessNotify(); + } + }); + }); + + // organizations close cla + $('.organizations-list-container').on('click', '.close-cla-action', function(){ + var $action = $(this); + + var userId = $action.data('id'); + $.ajax({ + url: '/admins/organizations/' + userId + '/close_cla', + method: 'POST', + dataType: 'json', + success: function() { + showSuccessNotify(); + } + }); + }); + + + } +}); \ No newline at end of file diff --git a/app/assets/javascripts/organizations/clas.js b/app/assets/javascripts/organizations/clas.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/organizations/clas.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/users/clas.js b/app/assets/javascripts/users/clas.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/users/clas.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/organizations/clas.scss b/app/assets/stylesheets/organizations/clas.scss new file mode 100644 index 000000000..1716eff69 --- /dev/null +++ b/app/assets/stylesheets/organizations/clas.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the organizations/clas controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/users/clas.scss b/app/assets/stylesheets/users/clas.scss new file mode 100644 index 000000000..c5dd66bb9 --- /dev/null +++ b/app/assets/stylesheets/users/clas.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the users/clas controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/admins/message_templates_controller.rb b/app/controllers/admins/message_templates_controller.rb index 87a3ccfe7..6a5000c24 100644 --- a/app/controllers/admins/message_templates_controller.rb +++ b/app/controllers/admins/message_templates_controller.rb @@ -49,7 +49,7 @@ class Admins::MessageTemplatesController < Admins::BaseController def message_template_params # type = @message_template.present? ? @message_template.type : "MessageTemplate::CustomTip" # params.require(type.split("::").join("_").underscore.to_sym).permit! - params.require(:message_template).permit! + params.require(:message_template_custom_tip).permit! end def get_template diff --git a/app/controllers/admins/organizations_controller.rb b/app/controllers/admins/organizations_controller.rb index 35fb4dee8..9ca23ba38 100644 --- a/app/controllers/admins/organizations_controller.rb +++ b/app/controllers/admins/organizations_controller.rb @@ -9,6 +9,19 @@ class Admins::OrganizationsController < Admins::BaseController @orgs = paginate orgs end + + def open_cla + @org = Organization.find(params[:id]) + @org.open_cla! + render_ok + end + + def close_cla + @org = Organization.find(params[:id]) + @org.close_cla! + render_ok + end + def show end diff --git a/app/controllers/organizations/clas_controller.rb b/app/controllers/organizations/clas_controller.rb new file mode 100644 index 000000000..369fb435c --- /dev/null +++ b/app/controllers/organizations/clas_controller.rb @@ -0,0 +1,63 @@ +class Organizations::ClasController < Organizations::BaseController + before_action :load_organization + before_action :load_cla, only: [:show, :update, :destroy] + def index + @cla = @organization.cla + end + + def show + end + + def create + tip_exception("您的组织还未拥有创建CLA权限,请联系管理员") if @organization.cla == false + ActiveRecord::Base.transaction do + if @organization.cla.present? + return tip_exception("组织已存在CLA!") + else + Organizations::CreateClaForm.new(cla_params).validate! + @cla = Cla.build(cla_params) + end + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + def update + ActiveRecord::Base.transaction do + Organizations::CreateClaForm.new(cla_params).validate! + @cla.update(cla_params) + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + def destroy + tip_exception("组织CLA已被签署,无法删除") if @cla.user_clas.size > 0 + ActiveRecord::Base.transaction do + @cla.destroy! + end + render_ok + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + + private + def cla_params + params.permit(:name, :key, :content, :organization_id, :pr_need) + end + + def load_organization + @organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id]) + return render_not_found("组织不存在") if @organization.nil? + return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition + end + + def load_cla + @cla = Cla.find_by!(organization:params[:organization_id], key: params[:id]) + end + +end diff --git a/app/controllers/users/clas_controller.rb b/app/controllers/users/clas_controller.rb new file mode 100644 index 000000000..e3a4de0c2 --- /dev/null +++ b/app/controllers/users/clas_controller.rb @@ -0,0 +1,22 @@ +class Users::ClasController < Users::BaseController + def index + @user_clas = UserCla.where(user: @_observed_user) + end + + def create + tip_exception("已签署过该组织CLA!") if @_observed_user.user_clas.where(cla_id: params[:cla_id]).size > 0 + ActiveRecord::Base.transaction do + Users::UserClaForm.new(user_cla_params).validate! + @user_cla = UserCla.build(user_cla_params, @_observed_user.id) + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + private + + def user_cla_params + params.permit(:email, :real_name, :cla_id) + end + +end diff --git a/app/forms/organizations/create_cla_form.rb b/app/forms/organizations/create_cla_form.rb new file mode 100644 index 000000000..e77053e9f --- /dev/null +++ b/app/forms/organizations/create_cla_form.rb @@ -0,0 +1,6 @@ +class Organizations::CreateClaForm < BaseForm + KEY_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾 + attr_accessor :name, :key, :content, :organization_id, :pr_need + validates :name, :organization_id , :key, presence: true + validates :name, format: { with: KEY_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } +end \ No newline at end of file diff --git a/app/forms/users/user_cla_form.rb b/app/forms/users/user_cla_form.rb new file mode 100644 index 000000000..24f615591 --- /dev/null +++ b/app/forms/users/user_cla_form.rb @@ -0,0 +1,6 @@ +class Users::UserClaForm + include ActiveModel::Model + attr_accessor :email, :real_name, :cla_id + validates :email, presence: true, format: { with: CustomRegexp::EMAIL } + end + \ No newline at end of file diff --git a/app/helpers/organizations/clas_helper.rb b/app/helpers/organizations/clas_helper.rb new file mode 100644 index 000000000..38c1531c3 --- /dev/null +++ b/app/helpers/organizations/clas_helper.rb @@ -0,0 +1,2 @@ +module Organizations::ClasHelper +end diff --git a/app/helpers/users/clas_helper.rb b/app/helpers/users/clas_helper.rb new file mode 100644 index 000000000..55e326d0d --- /dev/null +++ b/app/helpers/users/clas_helper.rb @@ -0,0 +1,2 @@ +module Users::ClasHelper +end diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 0cbf6fb0f..0c056f60c 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -1,41 +1,42 @@ -# == Schema Information -# -# Table name: attachments -# -# id :integer not null, primary key -# container_id :integer -# container_type :string(30) -# filename :string(255) default(""), not null -# disk_filename :string(255) default(""), not null -# filesize :integer default("0"), not null -# content_type :string(255) default("") -# digest :string(60) default(""), not null -# downloads :integer default("0"), not null -# author_id :integer default("0"), not null -# created_on :datetime -# description :text(65535) -# disk_directory :string(255) -# attachtype :integer default("1") -# is_public :integer default("1") -# copy_from :string(255) -# quotes :integer default("0") -# is_publish :integer default("1") -# publish_time :datetime -# resource_bank_id :integer -# unified_setting :boolean default("1") -# cloud_url :string(255) default("") -# course_second_category_id :integer default("0") -# delay_publish :boolean default("0") -# link :string(255) -# clone_id :integer -# -# Indexes -# -# index_attachments_on_author_id (author_id) -# index_attachments_on_clone_id (clone_id) -# index_attachments_on_container_id_and_container_type (container_id,container_type) -# index_attachments_on_created_on (created_on) -# +# == Schema Information +# +# Table name: attachments +# +# id :integer not null, primary key +# container_id :integer +# container_type :string(30) +# filename :string(255) default(""), not null +# disk_filename :string(255) default(""), not null +# filesize :integer default("0"), not null +# content_type :string(255) default("") +# digest :string(60) default(""), not null +# downloads :integer default("0"), not null +# author_id :integer default("0"), not null +# created_on :datetime +# description :text(65535) +# disk_directory :string(255) +# attachtype :integer default("1") +# is_public :integer default("1") +# copy_from :integer +# quotes :integer default("0") +# is_publish :integer default("1") +# publish_time :datetime +# resource_bank_id :integer +# unified_setting :boolean default("1") +# cloud_url :string(255) default("") +# course_second_category_id :integer default("0") +# delay_publish :boolean default("0") +# +# Indexes +# +# index_attachments_on_author_id (author_id) +# index_attachments_on_container_id_and_container_type (container_id,container_type) +# index_attachments_on_course_second_category_id (course_second_category_id) +# index_attachments_on_created_on (created_on) +# index_attachments_on_is_public (is_public) +# index_attachments_on_quotes (quotes) +# + diff --git a/app/models/ci/user.rb b/app/models/ci/user.rb index e4a4d0623..be151dee2 100644 --- a/app/models/ci/user.rb +++ b/app/models/ci/user.rb @@ -39,15 +39,15 @@ # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer -# is_shixun_marker :boolean default("0") -# admin_visitable :boolean default("0") -# collaborator :boolean default("0") +# platform :string(255) default("0") +# gitea_token :string(255) # gitea_uid :integer +# is_shixun_marker :boolean default("0") # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") -# gitea_token :string(255) -# platform :string(255) +# sign_cla :boolean default("0") +# cla :boolean default("0") # # Indexes # @@ -56,8 +56,7 @@ # index_users_on_homepage_teacher (homepage_teacher) # index_users_on_laboratory_id (laboratory_id) # index_users_on_login (login) UNIQUE -# index_users_on_mail (mail) UNIQUE -# index_users_on_phone (phone) UNIQUE +# index_users_on_mail (mail) # index_users_on_type (type) # diff --git a/app/models/cla.rb b/app/models/cla.rb new file mode 100644 index 000000000..d42726658 --- /dev/null +++ b/app/models/cla.rb @@ -0,0 +1,38 @@ +# == Schema Information +# +# Table name: clas +# +# id :integer not null, primary key +# name :string(255) not null +# key :string(255) not null +# content :text(65535) +# organization_id :integer not null +# pr_need :boolean default("0") +# count :integer default("0") +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_clas_on_key (key) +# index_clas_on_organization_id (organization_id) +# + +class Cla < ApplicationRecord + has_many :user_clas, :dependent => :destroy + has_many :users, through: :user_clas + belongs_to :organization + + def to_param + self.key.parameterize + end + + def self.build(params) + self.create!(organization_id: params[:organization_id], + name: params[:name], + key: params[:key], + content: params[:content], + pr_need: params[:pr_need] + ) + end +end diff --git a/app/models/commit_log.rb b/app/models/commit_log.rb index def2846fa..d351e6f48 100644 --- a/app/models/commit_log.rb +++ b/app/models/commit_log.rb @@ -1,3 +1,26 @@ +# == Schema Information +# +# Table name: commit_logs +# +# id :integer not null, primary key +# user_id :integer +# project_id :integer +# repository_id :integer +# name :string(255) +# full_name :string(255) +# commit_id :string(255) +# ref :string(255) +# message :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_commit_logs_on_commit_id (commit_id) +# index_commit_logs_on_project_id (project_id) +# index_commit_logs_on_user_id (user_id) +# + class CommitLog < ApplicationRecord belongs_to :user belongs_to :project diff --git a/app/models/edu_setting.rb b/app/models/edu_setting.rb index 22575ff15..f4a89c09b 100644 --- a/app/models/edu_setting.rb +++ b/app/models/edu_setting.rb @@ -1,18 +1,19 @@ -# == Schema Information -# -# Table name: edu_settings -# -# id :integer not null, primary key -# name :string(255) -# value :string(255) -# created_at :datetime not null -# updated_at :datetime not null -# description :string(255) -# -# Indexes -# -# index_edu_settings_on_name (name) UNIQUE -# +# == Schema Information +# +# Table name: edu_settings +# +# id :integer not null, primary key +# name :string(255) +# value :string(255) +# created_at :datetime not null +# updated_at :datetime not null +# description :string(255) +# +# Indexes +# +# index_edu_settings_on_name (name) UNIQUE +# + class EduSetting < ApplicationRecord after_commit :expire_value_cache diff --git a/app/models/gitea/public_key.rb b/app/models/gitea/public_key.rb index bb2192358..a9962dc67 100644 --- a/app/models/gitea/public_key.rb +++ b/app/models/gitea/public_key.rb @@ -1,3 +1,25 @@ +# == Schema Information +# +# Table name: public_key +# +# id :integer not null, primary key +# owner_id :integer not null +# name :string(255) not null +# fingerprint :string(255) not null +# content :text(16777215) not null +# mode :integer default("2"), not null +# type :integer default("1"), not null +# login_source_id :integer default("0"), not null +# created_unix :integer +# updated_unix :integer +# verified :boolean default("0"), not null +# +# Indexes +# +# IDX_public_key_fingerprint (fingerprint) +# IDX_public_key_owner_id (owner_id) +# + class Gitea::PublicKey < Gitea::Base self.inheritance_column = nil # FIX The single-table inheritance mechanism failed # establish_connection :gitea_db diff --git a/app/models/gitea/pull.rb b/app/models/gitea/pull.rb index 7adb8c366..70e61f5fa 100644 --- a/app/models/gitea/pull.rb +++ b/app/models/gitea/pull.rb @@ -16,10 +16,12 @@ # head_branch :string(255) # base_branch :string(255) # merge_base :string(40) +# allow_maintainer_edit :boolean default("0"), not null # has_merged :boolean # merged_commit_id :string(40) # merger_id :integer # merged_unix :integer +# flow :integer default("0"), not null # # Indexes # diff --git a/app/models/gitea/webhook.rb b/app/models/gitea/webhook.rb index f60f56788..ec1c836c4 100644 --- a/app/models/gitea/webhook.rb +++ b/app/models/gitea/webhook.rb @@ -1,3 +1,32 @@ +# == Schema Information +# +# Table name: webhook +# +# id :integer not null, primary key +# repo_id :integer +# org_id :integer +# is_system_webhook :boolean +# url :text(65535) +# http_method :string(255) +# content_type :integer +# secret :text(65535) +# events :text(65535) +# is_active :boolean +# type :string(16) +# meta :text(65535) +# last_status :integer +# created_unix :integer +# updated_unix :integer +# +# Indexes +# +# IDX_webhook_created_unix (created_unix) +# IDX_webhook_is_active (is_active) +# IDX_webhook_org_id (org_id) +# IDX_webhook_repo_id (repo_id) +# IDX_webhook_updated_unix (updated_unix) +# + class Gitea::Webhook < Gitea::Base serialize :events, JSON self.inheritance_column = nil @@ -10,4 +39,4 @@ class Gitea::Webhook < Gitea::Base enum hook_task_type: {gogs: 1, slack: 2, gitea: 3, discord: 4, dingtalk: 5, telegram: 6, msteams: 7, feishu: 8, matrix: 9} enum last_status: {waiting: 0, succeed: 1, fail: 2} enum content_type: {json: 1, form: 2} -end \ No newline at end of file +end diff --git a/app/models/gitea/webhook_task.rb b/app/models/gitea/webhook_task.rb index 7e9bc68a7..b612816ba 100644 --- a/app/models/gitea/webhook_task.rb +++ b/app/models/gitea/webhook_task.rb @@ -1,3 +1,19 @@ +# == Schema Information +# +# Table name: hook_task +# +# id :integer not null, primary key +# hook_id :integer +# uuid :string(255) +# payload_content :text(4294967295) +# event_type :string(255) +# is_delivered :boolean +# delivered :integer +# is_succeed :boolean +# request_content :text(4294967295) +# response_content :text(4294967295) +# + class Gitea::WebhookTask < Gitea::Base serialize :payload_content, JSON serialize :request_content, JSON @@ -11,4 +27,4 @@ class Gitea::WebhookTask < Gitea::Base enum type: {gogs: 1, slack: 2, gitea: 3, discord: 4, dingtalk: 5, telegram: 6, msteams: 7, feishu: 8, matrix: 9} -end \ No newline at end of file +end diff --git a/app/models/issue.rb b/app/models/issue.rb index e12f667db..eae5acf6f 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -5,7 +5,7 @@ # id :integer not null, primary key # tracker_id :integer not null # project_id :integer not null -# subject :string(255) default(""), not null +# subject :string(255) # description :text(4294967295) # due_date :date # category_id :integer @@ -33,6 +33,7 @@ # issue_classify :string(255) # ref_name :string(255) # branch_name :string(255) +# blockchain_token_num :integer # # Indexes # diff --git a/app/models/issue_participant.rb b/app/models/issue_participant.rb index fa7be6980..d756b28a2 100644 --- a/app/models/issue_participant.rb +++ b/app/models/issue_participant.rb @@ -1,3 +1,20 @@ +# == Schema Information +# +# Table name: issue_participants +# +# id :integer not null, primary key +# issue_id :integer +# participant_id :integer +# participant_type :integer default("0") +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_issue_participants_on_issue_id (issue_id) +# index_issue_participants_on_participant_id (participant_id) +# + class IssueParticipant < ApplicationRecord belongs_to :issue diff --git a/app/models/issue_tag.rb b/app/models/issue_tag.rb index b4ee673f7..7251e98f2 100644 --- a/app/models/issue_tag.rb +++ b/app/models/issue_tag.rb @@ -2,17 +2,18 @@ # # Table name: issue_tags # -# id :integer not null, primary key -# name :string(255) -# description :string(255) -# color :string(255) -# user_id :integer -# project_id :integer -# issues_count :integer default("0") -# created_at :datetime not null -# updated_at :datetime not null -# gid :integer -# gitea_url :string(255) +# id :integer not null, primary key +# name :string(190) +# description :string(255) +# color :string(255) +# user_id :integer +# project_id :integer +# issues_count :integer default("0") +# created_at :datetime not null +# updated_at :datetime not null +# gid :integer +# gitea_url :string(255) +# pull_requests_count :integer default("0") # # Indexes # diff --git a/app/models/laboratory.rb b/app/models/laboratory.rb index 9b409c170..0517c0df6 100644 --- a/app/models/laboratory.rb +++ b/app/models/laboratory.rb @@ -10,7 +10,6 @@ # sync_course :boolean default("0") # sync_subject :boolean default("0") # sync_shixun :boolean default("0") -# is_local :boolean default("0") # # Indexes # diff --git a/app/models/mark_file.rb b/app/models/mark_file.rb index c6c834623..663f6aca4 100644 --- a/app/models/mark_file.rb +++ b/app/models/mark_file.rb @@ -1,3 +1,23 @@ +# == Schema Information +# +# Table name: mark_files +# +# id :integer not null, primary key +# pull_request_id :integer +# user_id :integer +# file_path_sha :string(255) +# file_path :string(255) +# mark_as_read :boolean default("0") +# updated_after_read :boolean default("0") +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_mark_files_on_file_path_sha (file_path_sha) +# index_mark_files_on_pull_request_id (pull_request_id) +# + class MarkFile < ApplicationRecord belongs_to :pull_request diff --git a/app/models/message_template/issue_creator_expire.rb b/app/models/message_template/issue_creator_expire.rb index e6f42fcc4..c9478aa53 100644 --- a/app/models/message_template/issue_creator_expire.rb +++ b/app/models/message_template/issue_creator_expire.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: message_templates +# +# id :integer not null, primary key +# type :string(255) +# sys_notice :text(65535) +# email :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# notification_url :string(255) +# email_title :string(255) +# + class MessageTemplate::IssueCreatorExpire < MessageTemplate -end \ No newline at end of file +end diff --git a/app/models/organization.rb b/app/models/organization.rb index 75a2db971..281a52980 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -46,11 +46,8 @@ # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") -# sponsor_certification :integer default("0") -# sponsor_num :integer default("0") -# sponsored_num :integer default("0") -# sponsor_description :text(65535) -# award_time :datetime +# sign_cla :boolean default("0") +# cla :boolean default("0") # # Indexes # @@ -58,7 +55,7 @@ # index_users_on_homepage_engineer (homepage_engineer) # index_users_on_homepage_teacher (homepage_teacher) # index_users_on_laboratory_id (laboratory_id) -# index_users_on_login (login) +# index_users_on_login (login) UNIQUE # index_users_on_mail (mail) # index_users_on_type (type) # @@ -70,6 +67,8 @@ class Organization < Owner default_scope { where(type: "Organization") } has_one :organization_extension, dependent: :destroy + has_one :cla, dependent: :destroy + has_many :teams, dependent: :destroy has_many :organization_users, dependent: :destroy has_many :team_users, dependent: :destroy @@ -183,4 +182,17 @@ class Organization < Owner name end end + + def open_cla! + update_attribute(:cla, true) + end + + def close_cla! + update_attribute(:cla, false) + end + + def open_cla? + cla == true + end + end diff --git a/app/models/organization_extension.rb b/app/models/organization_extension.rb index cb216aca1..11f0c7694 100644 --- a/app/models/organization_extension.rb +++ b/app/models/organization_extension.rb @@ -19,6 +19,8 @@ # news_banner_id :integer # news_content :text(65535) # memo :text(65535) +# news_title :string(255) +# news_url :string(255) # # Indexes # diff --git a/app/models/praise_tread.rb b/app/models/praise_tread.rb index 0250f012e..0618aa575 100644 --- a/app/models/praise_tread.rb +++ b/app/models/praise_tread.rb @@ -1,19 +1,20 @@ -# == Schema Information -# -# Table name: praise_treads -# -# id :integer not null, primary key -# user_id :integer not null -# praise_tread_object_id :integer -# praise_tread_object_type :string(255) -# praise_or_tread :integer default("1") -# created_at :datetime not null -# updated_at :datetime not null -# -# Indexes -# -# praise_tread (praise_tread_object_id,praise_tread_object_type) -# +# == Schema Information +# +# Table name: praise_treads +# +# id :integer not null, primary key +# user_id :integer not null +# praise_tread_object_id :integer +# praise_tread_object_type :string(255) +# praise_or_tread :integer default("1") +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# praise_tread (praise_tread_object_id,praise_tread_object_type) +# + class PraiseTread < ApplicationRecord diff --git a/app/models/project.rb b/app/models/project.rb index a63a8dd42..3a868357c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -3,7 +3,7 @@ # Table name: projects # # id :integer not null, primary key -# name :string(255) +# name :string(190) # description :text(4294967295) # homepage :string(255) default("") # is_public :boolean default("1"), not null @@ -55,14 +55,17 @@ # default_branch :string(255) default("master") # website :string(255) # lesson_url :string(255) +# use_blockchain :boolean default("0") # is_pinned :boolean default("0") # recommend_index :integer default("0") +# pr_view_admin :boolean default("0") # # Indexes # # index_projects_on_forked_from_project_id (forked_from_project_id) # index_projects_on_identifier (identifier) # index_projects_on_invite_code (invite_code) +# index_projects_on_is_pinned (is_pinned) # index_projects_on_is_public (is_public) # index_projects_on_lft (lft) # index_projects_on_license_id (license_id) diff --git a/app/models/repository.rb b/app/models/repository.rb index ed1f81db3..f2815dde7 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -27,6 +27,7 @@ # # Indexes # +# index_repositories_on_identifier (identifier) # index_repositories_on_project_id (project_id) # index_repositories_on_user_id (user_id) # diff --git a/app/models/system_notification_history.rb b/app/models/system_notification_history.rb index b629babdf..9ecfc5bb8 100644 --- a/app/models/system_notification_history.rb +++ b/app/models/system_notification_history.rb @@ -2,16 +2,16 @@ # # Table name: system_notification_histories # -# id :integer not null, primary key -# system_message_id :integer -# user_id :integer -# created_at :datetime not null -# updated_at :datetime not null +# id :integer not null, primary key +# system_notification_id :integer +# user_id :integer +# created_at :datetime not null +# updated_at :datetime not null # # Indexes # -# index_system_notification_histories_on_system_message_id (system_message_id) -# index_system_notification_histories_on_user_id (user_id) +# index_system_notification_histories_on_system_notification_id (system_notification_id) +# index_system_notification_histories_on_user_id (user_id) # class SystemNotificationHistory < ApplicationRecord diff --git a/app/models/template_message_setting.rb b/app/models/template_message_setting.rb index 67f9586d0..5e4907b2e 100644 --- a/app/models/template_message_setting.rb +++ b/app/models/template_message_setting.rb @@ -6,9 +6,9 @@ # type :string(255) # name :string(255) # key :string(255) -# openning :boolean -# notification_disabled :boolean -# email_disabled :boolean +# openning :boolean default("1") +# notification_disabled :boolean default("1") +# email_disabled :boolean default("0") # created_at :datetime not null # updated_at :datetime not null # diff --git a/app/models/template_message_setting/create_or_assign.rb b/app/models/template_message_setting/create_or_assign.rb index 4c392b4b7..629051305 100644 --- a/app/models/template_message_setting/create_or_assign.rb +++ b/app/models/template_message_setting/create_or_assign.rb @@ -6,9 +6,9 @@ # type :string(255) # name :string(255) # key :string(255) -# openning :boolean -# notification_disabled :boolean -# email_disabled :boolean +# openning :boolean default("1") +# notification_disabled :boolean default("1") +# email_disabled :boolean default("0") # created_at :datetime not null # updated_at :datetime not null # diff --git a/app/models/template_message_setting/manage_project.rb b/app/models/template_message_setting/manage_project.rb index 978761f94..c9b2406d7 100644 --- a/app/models/template_message_setting/manage_project.rb +++ b/app/models/template_message_setting/manage_project.rb @@ -6,9 +6,9 @@ # type :string(255) # name :string(255) # key :string(255) -# openning :boolean -# notification_disabled :boolean -# email_disabled :boolean +# openning :boolean default("1") +# notification_disabled :boolean default("1") +# email_disabled :boolean default("0") # created_at :datetime not null # updated_at :datetime not null # diff --git a/app/models/template_message_setting/normal.rb b/app/models/template_message_setting/normal.rb index 771fba2f2..acf44009f 100644 --- a/app/models/template_message_setting/normal.rb +++ b/app/models/template_message_setting/normal.rb @@ -6,9 +6,9 @@ # type :string(255) # name :string(255) # key :string(255) -# openning :boolean -# notification_disabled :boolean -# email_disabled :boolean +# openning :boolean default("1") +# notification_disabled :boolean default("1") +# email_disabled :boolean default("0") # created_at :datetime not null # updated_at :datetime not null # diff --git a/app/models/template_message_setting/watch_project.rb b/app/models/template_message_setting/watch_project.rb index 35dfef6db..a07e4bb94 100644 --- a/app/models/template_message_setting/watch_project.rb +++ b/app/models/template_message_setting/watch_project.rb @@ -6,9 +6,9 @@ # type :string(255) # name :string(255) # key :string(255) -# openning :boolean -# notification_disabled :boolean -# email_disabled :boolean +# openning :boolean default("1") +# notification_disabled :boolean default("1") +# email_disabled :boolean default("0") # created_at :datetime not null # updated_at :datetime not null # diff --git a/app/models/timeable_visit_record.rb b/app/models/timeable_visit_record.rb index 8411ddf66..aee1d718f 100644 --- a/app/models/timeable_visit_record.rb +++ b/app/models/timeable_visit_record.rb @@ -5,7 +5,7 @@ # id :integer not null, primary key # time :string(255) # project_id :integer -# visits :integer +# visits :integer default("0") # created_at :datetime not null # updated_at :datetime not null # diff --git a/app/models/token.rb b/app/models/token.rb index 746af6535..fac516eb8 100644 --- a/app/models/token.rb +++ b/app/models/token.rb @@ -1,18 +1,19 @@ -# == Schema Information -# -# Table name: tokens -# -# id :integer not null, primary key -# user_id :integer default("0"), not null -# action :string(30) default(""), not null -# value :string(40) default(""), not null -# created_on :datetime not null -# -# Indexes -# -# index_tokens_on_user_id (user_id) -# tokens_value (value) UNIQUE -# +# == Schema Information +# +# Table name: tokens +# +# id :integer not null, primary key +# user_id :integer default("0"), not null +# action :string(30) default(""), not null +# value :string(40) default(""), not null +# created_on :datetime not null +# +# Indexes +# +# index_tokens_on_user_id (user_id) +# tokens_value (value) UNIQUE +# + # # This program is free software; you can redistribute it and/or diff --git a/app/models/topic.rb b/app/models/topic.rb index e464859ec..f7b4a11fb 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # diff --git a/app/models/topic/activity_forum.rb b/app/models/topic/activity_forum.rb index 8cf9adf83..ee2dc9941 100644 --- a/app/models/topic/activity_forum.rb +++ b/app/models/topic/activity_forum.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # diff --git a/app/models/topic/banner.rb b/app/models/topic/banner.rb index e5b77bec0..7abd2ac56 100644 --- a/app/models/topic/banner.rb +++ b/app/models/topic/banner.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # diff --git a/app/models/topic/card.rb b/app/models/topic/card.rb index 6a54e17ea..3baee486c 100644 --- a/app/models/topic/card.rb +++ b/app/models/topic/card.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # diff --git a/app/models/topic/cooperator.rb b/app/models/topic/cooperator.rb index a023d3656..0fab2c3b7 100644 --- a/app/models/topic/cooperator.rb +++ b/app/models/topic/cooperator.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # diff --git a/app/models/topic/excellent_project.rb b/app/models/topic/excellent_project.rb index ac08863c7..aec097f62 100644 --- a/app/models/topic/excellent_project.rb +++ b/app/models/topic/excellent_project.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # diff --git a/app/models/topic/experience_forum.rb b/app/models/topic/experience_forum.rb index 855a56809..9b48f9ed4 100644 --- a/app/models/topic/experience_forum.rb +++ b/app/models/topic/experience_forum.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # diff --git a/app/models/topic/glcc_news.rb b/app/models/topic/glcc_news.rb index 6b707bf07..4b2e758d2 100644 --- a/app/models/topic/glcc_news.rb +++ b/app/models/topic/glcc_news.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # @@ -14,4 +13,4 @@ # GLCC 新闻稿 class Topic::GlccNews < Topic -end \ No newline at end of file +end diff --git a/app/models/topic/pinned_forum.rb b/app/models/topic/pinned_forum.rb index c5a2c8572..78425ce6a 100644 --- a/app/models/topic/pinned_forum.rb +++ b/app/models/topic/pinned_forum.rb @@ -6,7 +6,6 @@ # type :string(255) # title :string(255) # uuid :integer -# image_url :string(255) # url :string(255) # order_index :integer # diff --git a/app/models/user.rb b/app/models/user.rb index 9d76696ea..7250eb09d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -47,6 +47,7 @@ # watchers_count :integer default("0") # devops_step :integer default("0") # sign_cla :boolean default("0") +# cla :boolean default("0") # # Indexes # @@ -181,6 +182,10 @@ class User < Owner has_many :issue_participants, foreign_key: :participant_id has_many :participant_issues, through: :issue_participants, source: :issue has_many :project_topics + #cla + has_many :user_clas, :dependent => :destroy + has_many :clas, through: :user_clas + # Groups and active users scope :active, lambda { where(status: [STATUS_ACTIVE, STATUS_EDIT_INFO]) } scope :like, lambda { |keywords| diff --git a/app/models/user_action.rb b/app/models/user_action.rb index 179359695..384475c4f 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -12,9 +12,10 @@ # # Indexes # -# index_user_actions_on_ip (ip) -# index_user_actions_on_user_id (user_id) -# index_user_actions_on_user_id_and_action_type (user_id,action_type) +# index_user_actions_on_action_id (action_id) +# index_user_actions_on_action_type (action_type) +# index_user_actions_on_ip (ip) +# index_user_actions_on_user_id (user_id) # class UserAction < ApplicationRecord diff --git a/app/models/user_agent.rb b/app/models/user_agent.rb index ba519d6fb..49d7b35a1 100644 --- a/app/models/user_agent.rb +++ b/app/models/user_agent.rb @@ -10,13 +10,10 @@ # updated_at :datetime not null # register_status :integer default("0") # action_status :integer default("0") -# is_delete :boolean default("0") -# user_id :integer # # Indexes # -# index_user_agents_on_ip (ip) -# index_user_agents_on_user_id (user_id) +# index_user_agents_on_ip (ip) UNIQUE # class UserAgent < ApplicationRecord diff --git a/app/models/user_cla.rb b/app/models/user_cla.rb new file mode 100644 index 000000000..a1accb41e --- /dev/null +++ b/app/models/user_cla.rb @@ -0,0 +1,35 @@ +# == Schema Information +# +# Table name: user_clas +# +# id :integer not null, primary key +# user_id :integer not null +# cla_id :integer not null +# real_name :string(255) not null +# email :string(255) not null +# state :integer default("0") +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_user_clas_on_cla_id (cla_id) +# index_user_clas_on_user_id (user_id) +# + +class UserCla < ApplicationRecord + belongs_to :user + belongs_to :cla +# identity 0: 教师教授 1: 学生, 2: 专业人士, 3: 开发者 + enum state: { deafult: 0, signed: 1, failed: 2} + + def self.build(params,user_id) + self.create!(user_id: user_id, + cla_id: params[:cla_id], + real_name: params[:real_name], + email: params[:email], + state: 1 + ) + end + +end diff --git a/app/models/user_extension.rb b/app/models/user_extension.rb index c1046ac2f..ef4af5fd3 100644 --- a/app/models/user_extension.rb +++ b/app/models/user_extension.rb @@ -20,7 +20,7 @@ # student_realname :string(255) # location_city :string(255) # school_id :integer -# description :string(255) default("") +# description :string(255) # department_id :integer # province :string(255) # city :string(255) diff --git a/app/models/version.rb b/app/models/version.rb index 82474f55e..ec2ad68cd 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -4,7 +4,7 @@ # # id :integer not null, primary key # project_id :integer default("0"), not null -# name :string(255) default(""), not null +# name :string(255) # description :text(65535) # effective_date :date # created_on :datetime diff --git a/app/models/version_release.rb b/app/models/version_release.rb index 00119f806..98c81b61d 100644 --- a/app/models/version_release.rb +++ b/app/models/version_release.rb @@ -4,9 +4,9 @@ # # id :integer not null, primary key # user_id :integer -# name :string(255) +# name :text(4294967295) # body :text(65535) -# tag_name :string(255) +# tag_name :text(65535) # target_commitish :string(255) # draft :boolean default("0") # prerelease :boolean default("0") diff --git a/app/views/admins/organizations/shared/_org_list.html.erb b/app/views/admins/organizations/shared/_org_list.html.erb index 25878b296..148681fb2 100644 --- a/app/views/admins/organizations/shared/_org_list.html.erb +++ b/app/views/admins/organizations/shared/_org_list.html.erb @@ -27,11 +27,12 @@ <%= link_to org.organization_users_count, "/#{org.login}", target: "_blank" %> <%= link_to org.projects_count, "/#{org.login}", target: "_blank" %> + <%= javascript_void_link '开通CLA', class: 'action open-cla-action', data: { id: org.id }, style: org.open_cla? ? 'display: none;' : '' %> + <%= javascript_void_link '关闭CLA', class: 'action close-cla-action', data: { id: org.id }, style: org.open_cla? ? '' : 'display: none;' %> <%= link_to '查看', admins_organization_path(org), class: 'action' %>
<%= javascript_void_link('更多', class: 'action dropdown-toggle', 'data-toggle': 'dropdown', 'aria-haspopup': true, 'aria-expanded': false) %>
diff --git a/app/views/admins/organizations/show.html.erb b/app/views/admins/organizations/show.html.erb index b40f1c258..102392567 100644 --- a/app/views/admins/organizations/show.html.erb +++ b/app/views/admins/organizations/show.html.erb @@ -29,6 +29,9 @@ <%= f.input :lastname, label: '姓名', wrapper_html: { class: 'col-md-3' }, input_html: { readonly: true, class: 'col-md-11', value: @org.real_name } %> +
+ <%= f.input :cla, label: '是否开通CLA', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-md-11', value: @org.cla } %> +
<% end %> diff --git a/app/views/organizations/clas/_detail.json.jbuilder b/app/views/organizations/clas/_detail.json.jbuilder new file mode 100644 index 000000000..39c4e6a33 --- /dev/null +++ b/app/views/organizations/clas/_detail.json.jbuilder @@ -0,0 +1,5 @@ +json.id cla.id +json.content cla.content +json.key cla.key +json.name cla.name +json.pr_need cla.pr_need diff --git a/app/views/organizations/clas/create.json.jbuilder b/app/views/organizations/clas/create.json.jbuilder new file mode 100644 index 000000000..e95312d8c --- /dev/null +++ b/app/views/organizations/clas/create.json.jbuilder @@ -0,0 +1 @@ +json.partial! "detail", cla: @cla, organization: @organization \ No newline at end of file diff --git a/app/views/organizations/clas/index.json.jbuilder b/app/views/organizations/clas/index.json.jbuilder new file mode 100644 index 000000000..260943dce --- /dev/null +++ b/app/views/organizations/clas/index.json.jbuilder @@ -0,0 +1,4 @@ +json.id @cla.id +json.key @cla.key +json.name @cla.name +json.pr_need @cla.pr_need diff --git a/app/views/organizations/clas/show.json.jbuilder b/app/views/organizations/clas/show.json.jbuilder new file mode 100644 index 000000000..4fa0db18c --- /dev/null +++ b/app/views/organizations/clas/show.json.jbuilder @@ -0,0 +1,6 @@ +json.partial! "detail", cla: @cla, organization: @organization +json.is_admin @is_admin +json.is_member @is_member +json.organization do + json.partial! "organizations/organizations/simple", organization: @organization +end \ No newline at end of file diff --git a/app/views/organizations/clas/update.json.jbuilder b/app/views/organizations/clas/update.json.jbuilder new file mode 100644 index 000000000..e95312d8c --- /dev/null +++ b/app/views/organizations/clas/update.json.jbuilder @@ -0,0 +1 @@ +json.partial! "detail", cla: @cla, organization: @organization \ No newline at end of file diff --git a/app/views/organizations/organizations/_detail.json.jbuilder b/app/views/organizations/organizations/_detail.json.jbuilder index c7614f039..fffc019dc 100644 --- a/app/views/organizations/organizations/_detail.json.jbuilder +++ b/app/views/organizations/organizations/_detail.json.jbuilder @@ -16,4 +16,5 @@ json.news_banner_id organization.news_banner_id json.news_content organization.news_content json.memo organization.memo json.news_title organization.news_title -json.news_url organization.news_url \ No newline at end of file +json.news_url organization.news_url +json.cla organization.cla \ No newline at end of file diff --git a/app/views/users/clas/_detail.json.jbuilder b/app/views/users/clas/_detail.json.jbuilder new file mode 100644 index 000000000..07bc5070b --- /dev/null +++ b/app/views/users/clas/_detail.json.jbuilder @@ -0,0 +1,8 @@ +json.id user_cla.id +json.real_name user_cla.real_name +json.email user_cla.email +json.state user_cla.state +json.created_at format_time(user_cla.created_at) +json.cla do + json.partial! "/organizations/clas/detail", locals: {cla: user_cla.cla} +end \ No newline at end of file diff --git a/app/views/users/clas/index.json.jbuilder b/app/views/users/clas/index.json.jbuilder new file mode 100644 index 000000000..d4e645c6e --- /dev/null +++ b/app/views/users/clas/index.json.jbuilder @@ -0,0 +1,3 @@ +json.user_clas @user_clas do |user_cla| + json.partial! "detail", user_cla: user_cla +end diff --git a/app/views/users/clas/show.json.jbuilder b/app/views/users/clas/show.json.jbuilder new file mode 100644 index 000000000..a34e77b7f --- /dev/null +++ b/app/views/users/clas/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "detail", user_cla: @user_cla diff --git a/config/routes.rb b/config/routes.rb index f34c9d44e..6ab9f228c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -147,6 +147,7 @@ Rails.application.routes.draw do delete :quit end end + resources :clas resources :teams, except: [:edit, :new] do collection do get :search @@ -389,7 +390,7 @@ Rails.application.routes.draw do scope module: :users do resource :interest, only: [:create] - + resources :clas, only: [:index,:create] resources :accounts, only: [:show, :update] do resource :phone_bind, only: [:create] resource :email_bind, only: [:create] @@ -847,7 +848,12 @@ Rails.application.routes.draw do resources :school_statistics, only: [:index] do get :contrast, on: :collection end - resources :organizations, only: [:index, :edit, :show, :destroy] + resources :organizations, only: [:index, :edit, :show, :destroy] do + member do + post :open_cla + post :close_cla + end + end resources :users, only: [:index, :edit, :update, :destroy] do member do post :reward_grade diff --git a/db/migrate/20230612020506_add_cla_to_users.rb b/db/migrate/20230612020506_add_cla_to_users.rb new file mode 100644 index 000000000..d16650c49 --- /dev/null +++ b/db/migrate/20230612020506_add_cla_to_users.rb @@ -0,0 +1,5 @@ +class AddClaToUsers < ActiveRecord::Migration[5.2] + def change + add_column :users, :cla, :boolean, default: false + end +end diff --git a/db/migrate/20230612031416_create_clas.rb b/db/migrate/20230612031416_create_clas.rb new file mode 100644 index 000000000..f85012429 --- /dev/null +++ b/db/migrate/20230612031416_create_clas.rb @@ -0,0 +1,13 @@ +class CreateClas < ActiveRecord::Migration[5.2] + def change + create_table :clas do |t| + t.string :name, null:false + t.string :key, index:true, null:false + t.text :content + t.integer :organization_id, index:true, null:false + t.boolean :pr_need, default: false + t.integer :count, default: 0 + t.timestamps + end + end +end diff --git a/db/migrate/20230612031448_create_user_clas.rb b/db/migrate/20230612031448_create_user_clas.rb new file mode 100644 index 000000000..715a363fb --- /dev/null +++ b/db/migrate/20230612031448_create_user_clas.rb @@ -0,0 +1,12 @@ +class CreateUserClas < ActiveRecord::Migration[5.2] + def change + create_table :user_clas do |t| + t.integer :user_id, null:false, index: true + t.integer :cla_id, null:false, index: true + t.string :real_name, null:false + t.string :email, null:false + t.integer :state, default:0 + t.timestamps + end + end +end diff --git a/spec/controllers/organizations/clas_controller_spec.rb b/spec/controllers/organizations/clas_controller_spec.rb new file mode 100644 index 000000000..e6df41003 --- /dev/null +++ b/spec/controllers/organizations/clas_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Organizations::ClasController, type: :controller do + +end diff --git a/spec/controllers/users/clas_controller_spec.rb b/spec/controllers/users/clas_controller_spec.rb new file mode 100644 index 000000000..02bc9979e --- /dev/null +++ b/spec/controllers/users/clas_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Users::ClasController, type: :controller do + +end diff --git a/spec/helpers/organizations/clas_helper_spec.rb b/spec/helpers/organizations/clas_helper_spec.rb new file mode 100644 index 000000000..18c3a1165 --- /dev/null +++ b/spec/helpers/organizations/clas_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the Organizations::ClasHelper. For example: +# +# describe Organizations::ClasHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe Organizations::ClasHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/helpers/users/clas_helper_spec.rb b/spec/helpers/users/clas_helper_spec.rb new file mode 100644 index 000000000..5bc4dd757 --- /dev/null +++ b/spec/helpers/users/clas_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the Users::ClasHelper. For example: +# +# describe Users::ClasHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe Users::ClasHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/cla_spec.rb b/spec/models/cla_spec.rb new file mode 100644 index 000000000..cc8796f17 --- /dev/null +++ b/spec/models/cla_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Cla, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/user_cla_spec.rb b/spec/models/user_cla_spec.rb new file mode 100644 index 000000000..3cf7c59db --- /dev/null +++ b/spec/models/user_cla_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe UserCla, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From 0a483cf7622d45ee5fb1cd2a1bff0629d81d78f8 Mon Sep 17 00:00:00 2001 From: chenjing Date: Tue, 13 Jun 2023 16:09:35 +0800 Subject: [PATCH 059/233] change migration index length --- db/migrate/20230612031416_create_clas.rb | 6 ++++-- db/migrate/20230612031448_create_user_clas.rb | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/db/migrate/20230612031416_create_clas.rb b/db/migrate/20230612031416_create_clas.rb index f85012429..67ffb2986 100644 --- a/db/migrate/20230612031416_create_clas.rb +++ b/db/migrate/20230612031416_create_clas.rb @@ -2,12 +2,14 @@ class CreateClas < ActiveRecord::Migration[5.2] def change create_table :clas do |t| t.string :name, null:false - t.string :key, index:true, null:false + t.string :key, null:false t.text :content - t.integer :organization_id, index:true, null:false + t.integer :organization_id, null:false t.boolean :pr_need, default: false t.integer :count, default: 0 t.timestamps end + add_index :clas, :key, :length =>190 + add_index :clas, :organization_id end end diff --git a/db/migrate/20230612031448_create_user_clas.rb b/db/migrate/20230612031448_create_user_clas.rb index 715a363fb..b79aafec3 100644 --- a/db/migrate/20230612031448_create_user_clas.rb +++ b/db/migrate/20230612031448_create_user_clas.rb @@ -1,12 +1,15 @@ class CreateUserClas < ActiveRecord::Migration[5.2] def change create_table :user_clas do |t| - t.integer :user_id, null:false, index: true - t.integer :cla_id, null:false, index: true + t.integer :user_id, null:false + t.integer :cla_id, null:false t.string :real_name, null:false t.string :email, null:false t.integer :state, default:0 t.timestamps end + add_index :user_clas, :user_id + add_index :user_clas, :cla_id + end end From bde92206415dc75688601d968fd613cbbb79ed2f Mon Sep 17 00:00:00 2001 From: chenjing Date: Tue, 13 Jun 2023 17:16:30 +0800 Subject: [PATCH 060/233] change cla --- .../javascripts/admins/organizations/index.js | 58 +++++++++++++------ .../admins/organizations_controller.rb | 11 ++-- .../organizations/clas_controller.rb | 2 +- app/models/ci/user.rb | 2 +- app/models/organization.rb | 8 +-- app/models/user.rb | 2 +- .../organizations/_detail.json.jbuilder | 2 +- ...50_change_cal_to_enabling_cla_for_users.rb | 5 ++ 8 files changed, 60 insertions(+), 30 deletions(-) create mode 100644 db/migrate/20230613082850_change_cal_to_enabling_cla_for_users.rb diff --git a/app/assets/javascripts/admins/organizations/index.js b/app/assets/javascripts/admins/organizations/index.js index b301e537d..97a5c76d1 100644 --- a/app/assets/javascripts/admins/organizations/index.js +++ b/app/assets/javascripts/admins/organizations/index.js @@ -10,32 +10,54 @@ $(document).on('turbolinks:load', function(){ // organizations open cla $('.organizations-list-container').on('click', '.open-cla-action', function(){ - var $action = $(this); + var $openClaAction = $(this); + var $closeClaAction = $openClaAction.siblings('.close-cla-action'); - var userId = $action.data('id'); - $.ajax({ - url: '/admins/organizations/' + userId + '/open_cla', - method: 'POST', - dataType: 'json', - success: function() { - showSuccessNotify(); + var userId = $openClaAction.data('id'); + customConfirm({ + content: '确认开通吗?', + ok: function () { + $.ajax({ + url: '/admins/organizations/' + userId + '/open_cla', + method: 'POST', + dataType: 'json', + success: function() { + showSuccessNotify(); + $closeClaAction.show(); + $openClaAction.hide(); + }, + error: function(res){ + $.notify({ message: res.responseJSON.message }, { type: 'danger' }); + } + }); } - }); + }) }); // organizations close cla $('.organizations-list-container').on('click', '.close-cla-action', function(){ - var $action = $(this); + var $closeClaAction = $(this); + var $openClaAction= $closeClaAction.siblings('.open-cla-action'); - var userId = $action.data('id'); - $.ajax({ - url: '/admins/organizations/' + userId + '/close_cla', - method: 'POST', - dataType: 'json', - success: function() { - showSuccessNotify(); + var userId = $openClaAction.data('id'); + customConfirm({ + content: '确认关闭吗?', + ok: function () { + $.ajax({ + url: '/admins/organizations/' + userId + '/close_cla', + method: 'POST', + dataType: 'json', + success: function() { + showSuccessNotify(); + $openClaAction.show(); + $closeClaAction.hide(); + }, + error: function(res){ + $.notify({ message: res.responseJSON.message }, { type: 'danger' }); + } + }); } - }); + }) }); diff --git a/app/controllers/admins/organizations_controller.rb b/app/controllers/admins/organizations_controller.rb index 9ca23ba38..c2e0ea96c 100644 --- a/app/controllers/admins/organizations_controller.rb +++ b/app/controllers/admins/organizations_controller.rb @@ -11,15 +11,18 @@ class Admins::OrganizationsController < Admins::BaseController def open_cla - @org = Organization.find(params[:id]) @org.open_cla! render_ok end def close_cla - @org = Organization.find(params[:id]) - @org.close_cla! - render_ok + if @org.cla.nil? + @org.close_cla! + render_ok + else + render_error(' 该组织已创建CLA 不允许关闭') + end + end def show diff --git a/app/controllers/organizations/clas_controller.rb b/app/controllers/organizations/clas_controller.rb index 369fb435c..531dc3c5d 100644 --- a/app/controllers/organizations/clas_controller.rb +++ b/app/controllers/organizations/clas_controller.rb @@ -9,7 +9,7 @@ class Organizations::ClasController < Organizations::BaseController end def create - tip_exception("您的组织还未拥有创建CLA权限,请联系管理员") if @organization.cla == false + tip_exception("您的组织还未拥有创建CLA权限,请联系管理员") if @organization.enabling_cla == false ActiveRecord::Base.transaction do if @organization.cla.present? return tip_exception("组织已存在CLA!") diff --git a/app/models/ci/user.rb b/app/models/ci/user.rb index be151dee2..62ed4c447 100644 --- a/app/models/ci/user.rb +++ b/app/models/ci/user.rb @@ -47,7 +47,7 @@ # watchers_count :integer default("0") # devops_step :integer default("0") # sign_cla :boolean default("0") -# cla :boolean default("0") +# enabling_cla :boolean default("0") # # Indexes # diff --git a/app/models/organization.rb b/app/models/organization.rb index 281a52980..e58cc91be 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -47,7 +47,7 @@ # watchers_count :integer default("0") # devops_step :integer default("0") # sign_cla :boolean default("0") -# cla :boolean default("0") +# enabling_cla :boolean default("0") # # Indexes # @@ -184,15 +184,15 @@ class Organization < Owner end def open_cla! - update_attribute(:cla, true) + update_attribute(:enabling_cla, true) end def close_cla! - update_attribute(:cla, false) + update_attribute(:enabling_cla, false) end def open_cla? - cla == true + enabling_cla == true end end diff --git a/app/models/user.rb b/app/models/user.rb index 7250eb09d..fd79bc408 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -47,7 +47,7 @@ # watchers_count :integer default("0") # devops_step :integer default("0") # sign_cla :boolean default("0") -# cla :boolean default("0") +# enabling_cla :boolean default("0") # # Indexes # diff --git a/app/views/organizations/organizations/_detail.json.jbuilder b/app/views/organizations/organizations/_detail.json.jbuilder index fffc019dc..1968e78c8 100644 --- a/app/views/organizations/organizations/_detail.json.jbuilder +++ b/app/views/organizations/organizations/_detail.json.jbuilder @@ -17,4 +17,4 @@ json.news_content organization.news_content json.memo organization.memo json.news_title organization.news_title json.news_url organization.news_url -json.cla organization.cla \ No newline at end of file +json.enabling_cla organization.enabling_cla \ No newline at end of file diff --git a/db/migrate/20230613082850_change_cal_to_enabling_cla_for_users.rb b/db/migrate/20230613082850_change_cal_to_enabling_cla_for_users.rb new file mode 100644 index 000000000..1c4a9e93b --- /dev/null +++ b/db/migrate/20230613082850_change_cal_to_enabling_cla_for_users.rb @@ -0,0 +1,5 @@ +class ChangeCalToEnablingClaForUsers < ActiveRecord::Migration[5.2] + def change + rename_column :users, :cla ,:enabling_cla + end +end From 04b335196225a5f25b5e532ed6143d6e2f9c5fa6 Mon Sep 17 00:00:00 2001 From: chenjing Date: Wed, 14 Jun 2023 10:46:48 +0800 Subject: [PATCH 061/233] change validate for create cla --- app/forms/organizations/create_cla_form.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/forms/organizations/create_cla_form.rb b/app/forms/organizations/create_cla_form.rb index e77053e9f..47499088f 100644 --- a/app/forms/organizations/create_cla_form.rb +++ b/app/forms/organizations/create_cla_form.rb @@ -2,5 +2,5 @@ class Organizations::CreateClaForm < BaseForm KEY_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾 attr_accessor :name, :key, :content, :organization_id, :pr_need validates :name, :organization_id , :key, presence: true - validates :name, format: { with: KEY_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } + validates :key, format: { with: KEY_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } end \ No newline at end of file From 0d00fd17442a0110739893a62e8349a7c02ad226 Mon Sep 17 00:00:00 2001 From: chenjing Date: Wed, 14 Jun 2023 11:22:13 +0800 Subject: [PATCH 062/233] fix when cla nil index error --- app/views/organizations/clas/index.json.jbuilder | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/views/organizations/clas/index.json.jbuilder b/app/views/organizations/clas/index.json.jbuilder index 260943dce..632fde017 100644 --- a/app/views/organizations/clas/index.json.jbuilder +++ b/app/views/organizations/clas/index.json.jbuilder @@ -1,4 +1,3 @@ -json.id @cla.id -json.key @cla.key -json.name @cla.name -json.pr_need @cla.pr_need +if @cla.present? + json.partial! "detail", cla: @cla +end \ No newline at end of file From 78a1d48a3ed3c1a930af8e23961c02e691bb5ea0 Mon Sep 17 00:00:00 2001 From: chenjing Date: Wed, 14 Jun 2023 11:58:51 +0800 Subject: [PATCH 063/233] fix bug --- app/controllers/organizations/clas_controller.rb | 4 ++-- app/models/cla.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/organizations/clas_controller.rb b/app/controllers/organizations/clas_controller.rb index 531dc3c5d..a8c92e99d 100644 --- a/app/controllers/organizations/clas_controller.rb +++ b/app/controllers/organizations/clas_controller.rb @@ -15,7 +15,7 @@ class Organizations::ClasController < Organizations::BaseController return tip_exception("组织已存在CLA!") else Organizations::CreateClaForm.new(cla_params).validate! - @cla = Cla.build(cla_params) + @cla = Cla.build(cla_params,@organization.id) end end rescue Exception => e @@ -57,7 +57,7 @@ class Organizations::ClasController < Organizations::BaseController end def load_cla - @cla = Cla.find_by!(organization:params[:organization_id], key: params[:id]) + @cla = Cla.find_by!(organization:@organization, key: params[:id]) end end diff --git a/app/models/cla.rb b/app/models/cla.rb index d42726658..ff5b8780f 100644 --- a/app/models/cla.rb +++ b/app/models/cla.rb @@ -27,8 +27,8 @@ class Cla < ApplicationRecord self.key.parameterize end - def self.build(params) - self.create!(organization_id: params[:organization_id], + def self.build(params,org_id) + self.create!(organization_id: org_id, name: params[:name], key: params[:key], content: params[:content], From b938025e5be02d1c8ff0d011f832dc80c3a3ab83 Mon Sep 17 00:00:00 2001 From: chenjing Date: Wed, 14 Jun 2023 14:20:58 +0800 Subject: [PATCH 064/233] cla add count --- app/controllers/users/clas_controller.rb | 1 + app/models/cla.rb | 5 +++++ app/models/user_cla.rb | 3 +++ app/views/organizations/clas/_detail.json.jbuilder | 1 + 4 files changed, 10 insertions(+) diff --git a/app/controllers/users/clas_controller.rb b/app/controllers/users/clas_controller.rb index e3a4de0c2..d5e93436e 100644 --- a/app/controllers/users/clas_controller.rb +++ b/app/controllers/users/clas_controller.rb @@ -8,6 +8,7 @@ class Users::ClasController < Users::BaseController ActiveRecord::Base.transaction do Users::UserClaForm.new(user_cla_params).validate! @user_cla = UserCla.build(user_cla_params, @_observed_user.id) + render_ok end rescue Exception => e uid_logger_error(e.message) diff --git a/app/models/cla.rb b/app/models/cla.rb index ff5b8780f..11f86dcd6 100644 --- a/app/models/cla.rb +++ b/app/models/cla.rb @@ -35,4 +35,9 @@ class Cla < ApplicationRecord pr_need: params[:pr_need] ) end + + + def fresh_count + update(count:self.users.count) + end end diff --git a/app/models/user_cla.rb b/app/models/user_cla.rb index a1accb41e..005533ce7 100644 --- a/app/models/user_cla.rb +++ b/app/models/user_cla.rb @@ -22,6 +22,9 @@ class UserCla < ApplicationRecord belongs_to :cla # identity 0: 教师教授 1: 学生, 2: 专业人士, 3: 开发者 enum state: { deafult: 0, signed: 1, failed: 2} + after_create do + cla.fresh_count + end def self.build(params,user_id) self.create!(user_id: user_id, diff --git a/app/views/organizations/clas/_detail.json.jbuilder b/app/views/organizations/clas/_detail.json.jbuilder index 39c4e6a33..b9d50183b 100644 --- a/app/views/organizations/clas/_detail.json.jbuilder +++ b/app/views/organizations/clas/_detail.json.jbuilder @@ -3,3 +3,4 @@ json.content cla.content json.key cla.key json.name cla.name json.pr_need cla.pr_need +json.count cla.count \ No newline at end of file From 6b772ea8890bab59516e52d7eb95d23d927258f4 Mon Sep 17 00:00:00 2001 From: chenjing Date: Wed, 14 Jun 2023 16:53:24 +0800 Subject: [PATCH 065/233] fix cla --- app/controllers/organizations/clas_controller.rb | 2 +- app/forms/organizations/create_cla_form.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/organizations/clas_controller.rb b/app/controllers/organizations/clas_controller.rb index a8c92e99d..e50cb8db4 100644 --- a/app/controllers/organizations/clas_controller.rb +++ b/app/controllers/organizations/clas_controller.rb @@ -47,7 +47,7 @@ class Organizations::ClasController < Organizations::BaseController private def cla_params - params.permit(:name, :key, :content, :organization_id, :pr_need) + params.permit(:name, :key, :content, :pr_need) end def load_organization diff --git a/app/forms/organizations/create_cla_form.rb b/app/forms/organizations/create_cla_form.rb index 47499088f..ce20a23ce 100644 --- a/app/forms/organizations/create_cla_form.rb +++ b/app/forms/organizations/create_cla_form.rb @@ -1,6 +1,6 @@ class Organizations::CreateClaForm < BaseForm KEY_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾 - attr_accessor :name, :key, :content, :organization_id, :pr_need - validates :name, :organization_id , :key, presence: true + attr_accessor :name, :key, :content, :pr_need + validates :name , :key, presence: true validates :key, format: { with: KEY_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } end \ No newline at end of file From fccf36e1eb71b4e0333e44cc603570e6a95a6941 Mon Sep 17 00:00:00 2001 From: chenjing Date: Thu, 15 Jun 2023 14:01:36 +0800 Subject: [PATCH 066/233] update response for cla --- app/controllers/organizations/clas_controller.rb | 6 +++++- app/models/organization.rb | 5 +++++ app/views/organizations/clas/show.json.jbuilder | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/controllers/organizations/clas_controller.rb b/app/controllers/organizations/clas_controller.rb index e50cb8db4..953cc9d5c 100644 --- a/app/controllers/organizations/clas_controller.rb +++ b/app/controllers/organizations/clas_controller.rb @@ -1,11 +1,15 @@ class Organizations::ClasController < Organizations::BaseController before_action :load_organization before_action :load_cla, only: [:show, :update, :destroy] + def index @cla = @organization.cla end - def show + def show + @is_admin = can_edit_org? + @is_member = @organization.is_member?(current_user.id) + @is_sign = @organization.is_sign?(current_user.id) end def create diff --git a/app/models/organization.rb b/app/models/organization.rb index e58cc91be..72788d025 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -107,6 +107,11 @@ class Organization < Owner organization_users.where(user_id: user_id).present? end + def is_sign?(user_id) + return false if cla.nil? + cla.user_clas.where(user_id: user_id).present? + end + def is_owner?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(owner)}).present? end diff --git a/app/views/organizations/clas/show.json.jbuilder b/app/views/organizations/clas/show.json.jbuilder index 4fa0db18c..1660b4d07 100644 --- a/app/views/organizations/clas/show.json.jbuilder +++ b/app/views/organizations/clas/show.json.jbuilder @@ -1,5 +1,6 @@ json.partial! "detail", cla: @cla, organization: @organization json.is_admin @is_admin +json.is_sign @is_sign json.is_member @is_member json.organization do json.partial! "organizations/organizations/simple", organization: @organization From cc4452e4adcec1bd6d55f202ce2f76bfdf9af6f6 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 15 Jun 2023 14:30:27 +0800 Subject: [PATCH 067/233] =?UTF-8?q?fixed=20readme=E4=B8=AD=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E9=93=BE=E6=8E=A5=E9=97=AE=E5=8F=B7=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 0f3f27ac0..796774564 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -136,6 +136,7 @@ module RepositoriesHelper # 链接直接跳过不做替换 next if s_content.starts_with?('http://') || s_content.starts_with?('https://') || s_content.starts_with?('mailto:') || s_content.blank? ext = File.extname(s_content)[1..-1] + ext = ext.split("?")[0] if ext.include?("?") if (image_type?(ext) || download_type(ext)) && !ext.blank? s_content = File.expand_path(s_content, file_path) s_content = s_content.split("#{Rails.root}/")[1] From fca25ff482b9a469a67a71d304acf1c5399d1834 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 15 Jun 2023 14:37:58 +0800 Subject: [PATCH 068/233] =?UTF-8?q?fixed=20readme=E4=B8=AD=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E9=93=BE=E6=8E=A5=E9=97=AE=E5=8F=B7=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 796774564..29662ea9f 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -142,7 +142,8 @@ module RepositoriesHelper s_content = s_content.split("#{Rails.root}/")[1] # content = content.gsub(s[0], "/#{s_content}") s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}?ref=#{ref}"].join - case k.to_s + s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}&ref=#{ref}"].join if s_content.include?("?") + case k.to_s when 'ss_src' content = content.gsub("src=\"#{s[0]}\"", "src=\"#{s_content}\"") when 'ss_src_1' From 328c5c35618708aec3da872ac2867d04198f48f4 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 15 Jun 2023 14:43:01 +0800 Subject: [PATCH 069/233] =?UTF-8?q?fixed=20readme=E4=B8=AD=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E9=93=BE=E6=8E=A5=E9=97=AE=E5=8F=B7=E5=A4=84=E7=90=86?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 29662ea9f..4ccaa7d36 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -141,8 +141,8 @@ module RepositoriesHelper s_content = File.expand_path(s_content, file_path) s_content = s_content.split("#{Rails.root}/")[1] # content = content.gsub(s[0], "/#{s_content}") - s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}?ref=#{ref}"].join - s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}&ref=#{ref}"].join if s_content.include?("?") + join_xxx = s_content.include?("?") ? "&" : "?" + s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}#{join_xxx}ref=#{ref}"].join case k.to_s when 'ss_src' content = content.gsub("src=\"#{s[0]}\"", "src=\"#{s_content}\"") From d5807c0df007e611c19f9ab5cd7e25e4a7b96f9e Mon Sep 17 00:00:00 2001 From: chenjing Date: Thu, 15 Jun 2023 17:45:07 +0800 Subject: [PATCH 070/233] cla send issue journal --- .../organizations/clas_controller.rb | 1 + app/controllers/pull_requests_controller.rb | 1 + .../pull_requests/send_journal_service.rb | 32 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 app/services/pull_requests/send_journal_service.rb diff --git a/app/controllers/organizations/clas_controller.rb b/app/controllers/organizations/clas_controller.rb index 953cc9d5c..ae88ee2f1 100644 --- a/app/controllers/organizations/clas_controller.rb +++ b/app/controllers/organizations/clas_controller.rb @@ -1,6 +1,7 @@ class Organizations::ClasController < Organizations::BaseController before_action :load_organization before_action :load_cla, only: [:show, :update, :destroy] + before_action :check_user_can_edit_org, only: [:create, :update, :destroy] def index @cla = @organization.cla diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 0cf022f7c..037e201bf 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -67,6 +67,7 @@ class PullRequestsController < ApplicationController Issues::CreateForm.new({subject: params[:title], description: params[:body].blank? ? params[:body] : params[:body].b}).validate! @pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params) if @gitea_pull_request[:status] == :success + PullRequests::SendJournalService.call(@project, @pull_request, current_user) @pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"], @gitea_pull_request[:body]["id"]) reviewers = User.where(id: params[:reviewer_ids]) @pull_request.reviewers = reviewers diff --git a/app/services/pull_requests/send_journal_service.rb b/app/services/pull_requests/send_journal_service.rb new file mode 100644 index 000000000..16e14ca2b --- /dev/null +++ b/app/services/pull_requests/send_journal_service.rb @@ -0,0 +1,32 @@ +class PullRequests::SendJournalService < ApplicationService + + def initialize(project, pull_request,current_user) + @project = project + @issue = pull_request + @current_user = current_user + @org = project.owner + end + + def call + if @org.enabling_cla && @org.cla.present? && @org.cla.pr_need && !@org.is_member?(@current_user&.id) + ActiveRecord::Base.transaction do + sender_id = if Rails.env.development? + User.last.id + else + 87461 + end + journal_params = { + journalized_id: @issue.id , + journalized_type: "Issue", + user_id: sender_id , + notes: "@xxx 您好!欢迎参与 #{@project.name} 的贡献。首次进行贡献请完成《#{@project.owner.cla.name}》的签署,签署完成后,项目成员才可查看到您的合并请求", + } + journal = Journal.new journal_params + if journal.save + TouchWebhookJob.set(wait: 5.seconds).perform_later('PullRequestComment', @issue&.id, sender_id, journal.id, 'created', {}) + push_activity_2_blockchain("issue_comment_create", journal) if Site.has_blockchain? && @project.use_blockchain + end + end + end + end +end From 74dcdebe5ebf2bf33c242d7cdffe9497372406ca Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Fri, 16 Jun 2023 08:44:26 +0800 Subject: [PATCH 071/233] add user_cla response --- app/controllers/users/clas_controller.rb | 2 ++ app/views/users/clas/_detail.json.jbuilder | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/users/clas_controller.rb b/app/controllers/users/clas_controller.rb index d5e93436e..864e1a7b4 100644 --- a/app/controllers/users/clas_controller.rb +++ b/app/controllers/users/clas_controller.rb @@ -1,4 +1,6 @@ class Users::ClasController < Users::BaseController + before_action :require_login + before_action :private_user_resources! def index @user_clas = UserCla.where(user: @_observed_user) end diff --git a/app/views/users/clas/_detail.json.jbuilder b/app/views/users/clas/_detail.json.jbuilder index 07bc5070b..5b6d246e5 100644 --- a/app/views/users/clas/_detail.json.jbuilder +++ b/app/views/users/clas/_detail.json.jbuilder @@ -5,4 +5,7 @@ json.state user_cla.state json.created_at format_time(user_cla.created_at) json.cla do json.partial! "/organizations/clas/detail", locals: {cla: user_cla.cla} -end \ No newline at end of file +end +json.organization do + json.partial! "organizations/organizations/simple", organization: user_cla.cla.organization + end \ No newline at end of file From fb4a44a6fa4b1ac77e45235e1cfb8af9935fbca8 Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Fri, 16 Jun 2023 10:07:06 +0800 Subject: [PATCH 072/233] cla pr and destroy user_cla --- app/controllers/users/clas_controller.rb | 24 ++++++++++++++----- app/models/cla.rb | 4 +++- .../pull_requests/send_journal_service.rb | 2 +- app/views/projects/_detail.json.jbuilder | 1 + app/views/pull_requests/index.json.jbuilder | 4 ++++ config/routes.rb | 2 +- 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/app/controllers/users/clas_controller.rb b/app/controllers/users/clas_controller.rb index 864e1a7b4..bede9ac81 100644 --- a/app/controllers/users/clas_controller.rb +++ b/app/controllers/users/clas_controller.rb @@ -2,20 +2,32 @@ class Users::ClasController < Users::BaseController before_action :require_login before_action :private_user_resources! def index - @user_clas = UserCla.where(user: @_observed_user) + @user_clas = UserCla.where(user: current_user) end def create - tip_exception("已签署过该组织CLA!") if @_observed_user.user_clas.where(cla_id: params[:cla_id]).size > 0 - ActiveRecord::Base.transaction do - Users::UserClaForm.new(user_cla_params).validate! - @user_cla = UserCla.build(user_cla_params, @_observed_user.id) - render_ok + @user_cla = current_user.user_clas.find_by(cla_id: params[:cla_id]) + if @user_cla + @user_cla.update_attributes(state: 1) + else + ActiveRecord::Base.transaction do + Users::UserClaForm.new(user_cla_params).validate! + @user_cla = UserCla.build(user_cla_params, current_user.id) + + end end + render_ok rescue Exception => e uid_logger_error(e.message) tip_exception(e.message) end + + def destroy + @user_cla = current_user.user_clas.find_by(cla_id: params[:cla_id]) + @user_cla.update_attributes(state: 2) + render_ok + end + private def user_cla_params diff --git a/app/models/cla.rb b/app/models/cla.rb index 11f86dcd6..fca050430 100644 --- a/app/models/cla.rb +++ b/app/models/cla.rb @@ -36,7 +36,9 @@ class Cla < ApplicationRecord ) end - + def valid_sign(user_id) + user_clas.where(user_id: user_id, state:1).present? + end def fresh_count update(count:self.users.count) end diff --git a/app/services/pull_requests/send_journal_service.rb b/app/services/pull_requests/send_journal_service.rb index 16e14ca2b..67cc6ca89 100644 --- a/app/services/pull_requests/send_journal_service.rb +++ b/app/services/pull_requests/send_journal_service.rb @@ -8,7 +8,7 @@ class PullRequests::SendJournalService < ApplicationService end def call - if @org.enabling_cla && @org.cla.present? && @org.cla.pr_need && !@org.is_member?(@current_user&.id) + if @org.enabling_cla && @org.cla.present? && @org.cla.pr_need && !@org.is_member?(@current_user&.id) && !@org.cla.valid_sign(@current_user&.id) ActiveRecord::Base.transaction do sender_id = if Rails.env.development? User.last.id diff --git a/app/views/projects/_detail.json.jbuilder b/app/views/projects/_detail.json.jbuilder index ed23fdef2..e60aaed8a 100644 --- a/app/views/projects/_detail.json.jbuilder +++ b/app/views/projects/_detail.json.jbuilder @@ -3,6 +3,7 @@ json.identifier project.identifier json.name project.name json.description project.description json.is_public project.is_public +json.pr_need @project.owner&.cla.try(:pr_need) json.owner do json.partial! "/users/user_simple", locals: {user: project.owner} end \ No newline at end of file diff --git a/app/views/pull_requests/index.json.jbuilder b/app/views/pull_requests/index.json.jbuilder index b7f642118..55dac139a 100644 --- a/app/views/pull_requests/index.json.jbuilder +++ b/app/views/pull_requests/index.json.jbuilder @@ -10,7 +10,11 @@ json.project_name @project.name json.project_author @project.owner.try(:login) json.project_author_name @project.owner.try(:show_real_name) json.has_created_pull_requests @project.pull_requests.size > 0 +<<<<<<< 74dcdebe5ebf2bf33c242d7cdffe9497372406ca json.disable_pr_vew @project.pr_view_admin? && !@project.manager?(current_user) +======= +json.pr_need @project.owner&.cla.try(:pr_need) +>>>>>>> cla pr and destroy user_cla json.issues do json.array! @issues.to_a do |issue| diff --git a/config/routes.rb b/config/routes.rb index 6ab9f228c..90526f9e6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -390,7 +390,7 @@ Rails.application.routes.draw do scope module: :users do resource :interest, only: [:create] - resources :clas, only: [:index,:create] + resources :clas resources :accounts, only: [:show, :update] do resource :phone_bind, only: [:create] resource :email_bind, only: [:create] From d407b3c67444b6d13384aacd85b1343c447514fa Mon Sep 17 00:00:00 2001 From: xxqfamous Date: Wed, 7 Jun 2023 11:03:49 +0800 Subject: [PATCH 073/233] =?UTF-8?q?=E7=A6=81=E6=AD=A2pr=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/pull_requests/index.json.jbuilder | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/views/pull_requests/index.json.jbuilder b/app/views/pull_requests/index.json.jbuilder index 55dac139a..b888c99fd 100644 --- a/app/views/pull_requests/index.json.jbuilder +++ b/app/views/pull_requests/index.json.jbuilder @@ -10,11 +10,8 @@ json.project_name @project.name json.project_author @project.owner.try(:login) json.project_author_name @project.owner.try(:show_real_name) json.has_created_pull_requests @project.pull_requests.size > 0 -<<<<<<< 74dcdebe5ebf2bf33c242d7cdffe9497372406ca json.disable_pr_vew @project.pr_view_admin? && !@project.manager?(current_user) -======= json.pr_need @project.owner&.cla.try(:pr_need) ->>>>>>> cla pr and destroy user_cla json.issues do json.array! @issues.to_a do |issue| From fed604989f81f221119aaab6792cc8f2a161f163 Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Fri, 16 Jun 2023 10:35:10 +0800 Subject: [PATCH 074/233] cla show add response --- app/controllers/organizations/clas_controller.rb | 3 +++ app/models/organization.rb | 5 +++++ app/views/organizations/clas/show.json.jbuilder | 1 + 3 files changed, 9 insertions(+) diff --git a/app/controllers/organizations/clas_controller.rb b/app/controllers/organizations/clas_controller.rb index ae88ee2f1..2549d7411 100644 --- a/app/controllers/organizations/clas_controller.rb +++ b/app/controllers/organizations/clas_controller.rb @@ -11,6 +11,9 @@ class Organizations::ClasController < Organizations::BaseController @is_admin = can_edit_org? @is_member = @organization.is_member?(current_user.id) @is_sign = @organization.is_sign?(current_user.id) + @cla_sign_email = if @is_sign + @organization.cla_sign_email(current_user.id) + end end def create diff --git a/app/models/organization.rb b/app/models/organization.rb index f3df5da18..5c3ce6d2b 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -112,6 +112,11 @@ class Organization < Owner cla.user_clas.where(user_id: user_id).present? end + def cla_sign_email(user_id) + cla.user_clas.find_by(user_id: user_id)&.email + end + + def is_owner?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(owner)}).present? end diff --git a/app/views/organizations/clas/show.json.jbuilder b/app/views/organizations/clas/show.json.jbuilder index 1660b4d07..8c55f38e2 100644 --- a/app/views/organizations/clas/show.json.jbuilder +++ b/app/views/organizations/clas/show.json.jbuilder @@ -1,6 +1,7 @@ json.partial! "detail", cla: @cla, organization: @organization json.is_admin @is_admin json.is_sign @is_sign +json.cla_sign_email @cla_sign_email json.is_member @is_member json.organization do json.partial! "organizations/organizations/simple", organization: @organization From a04e0508d6d1f0fcdcb3dc88aee6a6041a05c26e Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Fri, 16 Jun 2023 11:01:27 +0800 Subject: [PATCH 075/233] update --- app/controllers/users/clas_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/users/clas_controller.rb b/app/controllers/users/clas_controller.rb index bede9ac81..9d659761a 100644 --- a/app/controllers/users/clas_controller.rb +++ b/app/controllers/users/clas_controller.rb @@ -23,7 +23,7 @@ class Users::ClasController < Users::BaseController end def destroy - @user_cla = current_user.user_clas.find_by(cla_id: params[:cla_id]) + @user_cla = current_user.user_clas.find params[:id] @user_cla.update_attributes(state: 2) render_ok end From 1727435aa69c1a8dd064291e620490d55c4fb1a6 Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Fri, 16 Jun 2023 11:58:31 +0800 Subject: [PATCH 076/233] add pull request state --- app/models/organization.rb | 2 +- app/models/pull_request.rb | 3 ++- app/models/user_cla.rb | 13 +++++++++++++ app/services/pull_requests/send_journal_service.rb | 4 +++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/models/organization.rb b/app/models/organization.rb index 5c3ce6d2b..cd533d32d 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -109,7 +109,7 @@ class Organization < Owner def is_sign?(user_id) return false if cla.nil? - cla.user_clas.where(user_id: user_id).present? + cla.user_clas.where(user_id: user_id, status: 1).present? end def cla_sign_email(user_id) diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index e46777951..0142f27f6 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -24,10 +24,11 @@ # class PullRequest < ApplicationRecord - #status 0 默认未合并, 1表示合并, 2表示请求拒绝(或已关闭) + #status 0 默认未合并, 1表示合并, 2表示请求拒绝(或已关闭) ,3 表示未签署CLA OPEN = 0 MERGED = 1 CLOSED = 2 + NEEDCLA = 3 belongs_to :issue belongs_to :user diff --git a/app/models/user_cla.rb b/app/models/user_cla.rb index 005533ce7..cd3cea8a8 100644 --- a/app/models/user_cla.rb +++ b/app/models/user_cla.rb @@ -26,6 +26,10 @@ class UserCla < ApplicationRecord cla.fresh_count end + before_save do + fresh_pull_request + end + def self.build(params,user_id) self.create!(user_id: user_id, cla_id: params[:cla_id], @@ -35,4 +39,13 @@ class UserCla < ApplicationRecord ) end + def fresh_pull_request + gitea_ids = Project.where(user_id: cla.user_id).pluck(:gpid) + if state == "signed" + PullRequest.where(user_id: user_id, gitea_id: gitea_ids, status:3).update_all(status:0) + else + PullRequest.where(user_id: user_id, gitea_id: gitea_ids, status:0).update_all(status:3) + end + end + end diff --git a/app/services/pull_requests/send_journal_service.rb b/app/services/pull_requests/send_journal_service.rb index 67cc6ca89..816b13f11 100644 --- a/app/services/pull_requests/send_journal_service.rb +++ b/app/services/pull_requests/send_journal_service.rb @@ -2,7 +2,8 @@ class PullRequests::SendJournalService < ApplicationService def initialize(project, pull_request,current_user) @project = project - @issue = pull_request + @pull_request = pull_request + @issue = pull_request.issue @current_user = current_user @org = project.owner end @@ -23,6 +24,7 @@ class PullRequests::SendJournalService < ApplicationService } journal = Journal.new journal_params if journal.save + @pull_request.update_attributes(status: 3) TouchWebhookJob.set(wait: 5.seconds).perform_later('PullRequestComment', @issue&.id, sender_id, journal.id, 'created', {}) push_activity_2_blockchain("issue_comment_create", journal) if Site.has_blockchain? && @project.use_blockchain end From 4077de736032e1e2291cc505dbfcb1a5fb7f4ed6 Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Fri, 16 Jun 2023 16:27:07 +0800 Subject: [PATCH 077/233] fix cla error for pr --- app/views/pull_requests/index.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/pull_requests/index.json.jbuilder b/app/views/pull_requests/index.json.jbuilder index b888c99fd..2c17dcca6 100644 --- a/app/views/pull_requests/index.json.jbuilder +++ b/app/views/pull_requests/index.json.jbuilder @@ -11,7 +11,7 @@ json.project_author @project.owner.try(:login) json.project_author_name @project.owner.try(:show_real_name) json.has_created_pull_requests @project.pull_requests.size > 0 json.disable_pr_vew @project.pr_view_admin? && !@project.manager?(current_user) -json.pr_need @project.owner&.cla.try(:pr_need) +json.pr_need @project.owner.class == User ? false : @project.owner&.cla.try(:pr_need) json.issues do json.array! @issues.to_a do |issue| From 633a6ba585962b70b150e373f5e4bee0245b5cef Mon Sep 17 00:00:00 2001 From: chenjing <28122123@qq.com> Date: Fri, 16 Jun 2023 17:09:55 +0800 Subject: [PATCH 078/233] update JournalService notes --- app/services/pull_requests/send_journal_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/pull_requests/send_journal_service.rb b/app/services/pull_requests/send_journal_service.rb index 816b13f11..17f6fdabd 100644 --- a/app/services/pull_requests/send_journal_service.rb +++ b/app/services/pull_requests/send_journal_service.rb @@ -20,7 +20,7 @@ class PullRequests::SendJournalService < ApplicationService journalized_id: @issue.id , journalized_type: "Issue", user_id: sender_id , - notes: "@xxx 您好!欢迎参与 #{@project.name} 的贡献。首次进行贡献请完成《#{@project.owner.cla.name}》的签署,签署完成后,项目成员才可查看到您的合并请求", + notes: "@#{@current_user.nickname} 您好!欢迎参与 #{@project.name} 的贡献。首次进行贡献请完成《#{@project.owner.cla.name}》的签署,签署完成后,项目成员才可查看到您的合并请求", } journal = Journal.new journal_params if journal.save From 7a9be101945dec9f2f155d7a61050e4c2838e900 Mon Sep 17 00:00:00 2001 From: chenjing Date: Mon, 19 Jun 2023 10:44:58 +0800 Subject: [PATCH 079/233] fix bug --- app/models/organization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/organization.rb b/app/models/organization.rb index cd533d32d..fb1659d1a 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -109,7 +109,7 @@ class Organization < Owner def is_sign?(user_id) return false if cla.nil? - cla.user_clas.where(user_id: user_id, status: 1).present? + cla.user_clas.where(user_id: user_id, state: 1).present? end def cla_sign_email(user_id) From 86a616fc2ffd4971d8fa2169d203ec2672527ad6 Mon Sep 17 00:00:00 2001 From: chenjing Date: Mon, 19 Jun 2023 11:14:45 +0800 Subject: [PATCH 080/233] fix org delete error --- app/services/admins/delete_organization_service.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/services/admins/delete_organization_service.rb b/app/services/admins/delete_organization_service.rb index d5c9bd2c5..2a7b4aab1 100644 --- a/app/services/admins/delete_organization_service.rb +++ b/app/services/admins/delete_organization_service.rb @@ -6,9 +6,6 @@ class Admins::DeleteOrganizationService < Gitea::ClientService end def call - response = delete(url, params) - render_status(response) - Gitea::Organization::DeleteService.call(token,name) end From 325f3453813b224d0ed78622f797d7cb4aace385 Mon Sep 17 00:00:00 2001 From: chenjing Date: Mon, 19 Jun 2023 15:10:16 +0800 Subject: [PATCH 081/233] fix --- app/models/user_cla.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/models/user_cla.rb b/app/models/user_cla.rb index cd3cea8a8..848a825db 100644 --- a/app/models/user_cla.rb +++ b/app/models/user_cla.rb @@ -30,8 +30,8 @@ class UserCla < ApplicationRecord fresh_pull_request end - def self.build(params,user_id) - self.create!(user_id: user_id, + def self.build(params,current_user_id) + self.create!(user_id: current_user_id, cla_id: params[:cla_id], real_name: params[:real_name], email: params[:email], @@ -40,11 +40,11 @@ class UserCla < ApplicationRecord end def fresh_pull_request - gitea_ids = Project.where(user_id: cla.user_id).pluck(:gpid) + project_ids = cla.organization.projects.pluck(:id) if state == "signed" - PullRequest.where(user_id: user_id, gitea_id: gitea_ids, status:3).update_all(status:0) + PullRequest.where(user_id: user_id, project_id: project_ids, status:3).update_all(status:0) else - PullRequest.where(user_id: user_id, gitea_id: gitea_ids, status:0).update_all(status:3) + PullRequest.where(user_id: user_id, project_id: project_ids, status:0).update_all(status:3) end end From 65eaafe003178126aada56f9a2343cf62e257409 Mon Sep 17 00:00:00 2001 From: chenjing Date: Mon, 19 Jun 2023 15:25:38 +0800 Subject: [PATCH 082/233] fix admins org and show private org's cla --- app/controllers/organizations/clas_controller.rb | 1 - app/views/admins/organizations/show.html.erb | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/controllers/organizations/clas_controller.rb b/app/controllers/organizations/clas_controller.rb index 2549d7411..cc3f4e11f 100644 --- a/app/controllers/organizations/clas_controller.rb +++ b/app/controllers/organizations/clas_controller.rb @@ -61,7 +61,6 @@ class Organizations::ClasController < Organizations::BaseController def load_organization @organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id]) return render_not_found("组织不存在") if @organization.nil? - return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition end def load_cla diff --git a/app/views/admins/organizations/show.html.erb b/app/views/admins/organizations/show.html.erb index 102392567..501b1b5ad 100644 --- a/app/views/admins/organizations/show.html.erb +++ b/app/views/admins/organizations/show.html.erb @@ -28,11 +28,9 @@
<%= f.input :lastname, label: '姓名', wrapper_html: { class: 'col-md-3' }, input_html: { readonly: true, class: 'col-md-11', value: @org.real_name } %>
-
- <%= f.input :cla, label: '是否开通CLA', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-md-11', value: @org.cla } %> + <%= f.input :enabling_cla, as: :boolean, label: '开通CLA', checked_value: 1, unchecked_value: 0 %>
- <% end %>

组织项目

From c0f0b90347cccc0bc0088b627785f2a5bdae032e Mon Sep 17 00:00:00 2001 From: xxq250 Date: Mon, 19 Jun 2023 15:46:19 +0800 Subject: [PATCH 083/233] =?UTF-8?q?fixed=20job=E4=B8=ADissue=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/touch_webhook_job.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/jobs/touch_webhook_job.rb b/app/jobs/touch_webhook_job.rb index 0a8c03e9f..514fa6950 100644 --- a/app/jobs/touch_webhook_job.rb +++ b/app/jobs/touch_webhook_job.rb @@ -49,9 +49,9 @@ class TouchWebhookJob < ApplicationJob when 'IssueComment' issue_id, sender_id, comment_id, action_type, comment_json = args[0], args[1], args[2], args[3], args[4] issue = Issue.find_by_id issue_id - comment = issue.comment_journals.find_by_id comment_id sender = User.find_by_id sender_id - return if issue.nil? || sender.nil? + return if issue.nil? || sender.nil? + comment = issue.comment_journals.find_by_id comment_id return if action_type == 'edited' && comment_json.blank? issue.project.webhooks.each do |webhook| @@ -63,10 +63,10 @@ class TouchWebhookJob < ApplicationJob when 'PullRequestComment' issue_id, sender_id, comment_id, action_type, comment_json = args[0], args[1], args[2], args[3], args[4] issue = Issue.find_by_id(issue_id) - comment = issue.comment_journals.find_by_id comment_id sender = User.find_by_id sender_id pull = issue.try(:pull_request) - return if pull.nil? || sender.nil? + return if issue.nil? || pull.nil? || sender.nil? + comment = issue.comment_journals.find_by_id comment_id return if action_type == 'edited' && comment_json.blank? pull.project.webhooks.each do |webhook| From 99f2c5b99613fb9399dc5a96fe5d352bb0b6d590 Mon Sep 17 00:00:00 2001 From: chenjing Date: Mon, 19 Jun 2023 16:43:06 +0800 Subject: [PATCH 084/233] add user cla show --- app/controllers/users/clas_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/controllers/users/clas_controller.rb b/app/controllers/users/clas_controller.rb index 9d659761a..51a93819b 100644 --- a/app/controllers/users/clas_controller.rb +++ b/app/controllers/users/clas_controller.rb @@ -4,6 +4,10 @@ class Users::ClasController < Users::BaseController def index @user_clas = UserCla.where(user: current_user) end + + def show + @user_cla = current_user.user_clas.find params[:id] + end def create @user_cla = current_user.user_clas.find_by(cla_id: params[:cla_id]) From 65816a980b4187eb7e6a3467d792a56bab0d8889 Mon Sep 17 00:00:00 2001 From: chenjing Date: Tue, 20 Jun 2023 15:27:03 +0800 Subject: [PATCH 085/233] cla fix and add token verify --- app/controllers/projects_controller.rb | 15 +++- app/controllers/users/clas_controller.rb | 8 +- app/models/cla.rb | 3 +- app/models/user_cla.rb | 14 +++- .../projects/verify_auth_token_service.rb | 83 +++++++++++++++++++ .../pull_requests/send_journal_service.rb | 2 +- app/views/users/clas/_detail.json.jbuilder | 2 +- config/routes.rb | 1 + ...230620030511_add_sign_time_to_user_clas.rb | 5 ++ 9 files changed, 123 insertions(+), 10 deletions(-) create mode 100644 app/services/projects/verify_auth_token_service.rb create mode 100644 db/migrate/20230620030511_add_sign_time_to_user_clas.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 0d7caba05..e5dc7103a 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -4,9 +4,9 @@ class ProjectsController < ApplicationController include ProjectsHelper include Acceleratorable - before_action :require_login, except: %i[index branches branches_slice group_type_list simple show fork_users praise_users watch_users recommend banner_recommend about menu_list] - before_action :require_profile_completed, only: [:create, :migrate] - before_action :load_repository, except: %i[index group_type_list migrate create recommend banner_recommend] + before_action :require_login, except: %i[index branches branches_slice group_type_list simple show fork_users praise_users watch_users recommend banner_recommend about menu_list verify_auth_token] + before_action :require_profile_completed, only: [:create, :migrate,:verify_auth_token] + before_action :load_repository, except: %i[index group_type_list migrate create recommend banner_recommend verify_auth_token] before_action :authorizate_user_can_edit_project!, only: %i[update] before_action :project_public?, only: %i[fork_users praise_users watch_users] before_action :request_limit, only: %i[index] @@ -63,6 +63,15 @@ class ProjectsController < ApplicationController tip_exception(e.message) end + def verify_auth_token + data = Projects::VerifyAuthTokenService.call(params[:clone_addr], params[:auth_token]) + if data + render_ok + else + render_error('token验证不通过') + end + end + def migrate Projects::MigrateForm.new(mirror_params).validate! diff --git a/app/controllers/users/clas_controller.rb b/app/controllers/users/clas_controller.rb index 51a93819b..b1e09cacc 100644 --- a/app/controllers/users/clas_controller.rb +++ b/app/controllers/users/clas_controller.rb @@ -11,14 +11,16 @@ class Users::ClasController < Users::BaseController def create @user_cla = current_user.user_clas.find_by(cla_id: params[:cla_id]) - if @user_cla - @user_cla.update_attributes(state: 1) - else + if @user_cla.nil? ActiveRecord::Base.transaction do Users::UserClaForm.new(user_cla_params).validate! @user_cla = UserCla.build(user_cla_params, current_user.id) end + elsif @user_cla.state == "failed" + @user_cla.update_by_params(user_cla_params) + elsif @user_cla.state == "signed" + return render_error('协议生效中,请勿重复签署') end render_ok rescue Exception => e diff --git a/app/models/cla.rb b/app/models/cla.rb index fca050430..6bbfb6143 100644 --- a/app/models/cla.rb +++ b/app/models/cla.rb @@ -40,6 +40,7 @@ class Cla < ApplicationRecord user_clas.where(user_id: user_id, state:1).present? end def fresh_count - update(count:self.users.count) + number = self.user_clas.where(state: 1).count + update(count: number) end end diff --git a/app/models/user_cla.rb b/app/models/user_cla.rb index 848a825db..b109a74fa 100644 --- a/app/models/user_cla.rb +++ b/app/models/user_cla.rb @@ -10,6 +10,7 @@ # state :integer default("0") # created_at :datetime not null # updated_at :datetime not null +# sign_time :datetime # # Indexes # @@ -22,7 +23,8 @@ class UserCla < ApplicationRecord belongs_to :cla # identity 0: 教师教授 1: 学生, 2: 专业人士, 3: 开发者 enum state: { deafult: 0, signed: 1, failed: 2} - after_create do + + after_save do cla.fresh_count end @@ -35,10 +37,20 @@ class UserCla < ApplicationRecord cla_id: params[:cla_id], real_name: params[:real_name], email: params[:email], + sign_time: Time.now, state: 1 ) end + def update_by_params(params) + update(\ + state: 1, + sign_time: Time.now, + real_name: params[:real_name], + email: params[:email], + ) + end + def fresh_pull_request project_ids = cla.organization.projects.pluck(:id) if state == "signed" diff --git a/app/services/projects/verify_auth_token_service.rb b/app/services/projects/verify_auth_token_service.rb new file mode 100644 index 000000000..1318bb9db --- /dev/null +++ b/app/services/projects/verify_auth_token_service.rb @@ -0,0 +1,83 @@ +class Projects::VerifyAuthTokenService < ApplicationService + attr_accessor :url, :token + + def initialize(url, token) + @url = url + @token = token + @repo = nil + @owner = nil + @website = nil + @success = nil + end + + def call + Rails.logger.info("###### VerifyAuthTokenService begin ######") + regular_url + to_verify + Rails.logger.info("##### VerifyAuthTokenService end ######") + return @success + end + + private + def regular_url + regx = /\/\/[\s\S]*.git$/ #获取字串 + data = (regx.match @url).to_s[2..-5].split("/") + @website = data[0] + @owner = data[1] + @repo = data[2] + end + + + def to_verify + data = case @website + when "github.com" + github_verify + when "gitlab.com" + gitlab_verify + when "gitee.com" + gitee_verify + end + end + + def gitee_verify + url = "/api/v5/repos/#{@owner}/#{@repo}" + api_url= "https://gitee.com" + client = Faraday.new(url: api_url) + client.options["open_timeout"] = 1 + client.options["timeout"] = 1 + client.options["write_timeout"] = 1 + req_params={ + access_token: @token, + owner: @owner, + repo: @repo + } + response = client.public_send("get", url, req_params) + @success = true if response.status == 200 + end + + def github_verify + url = "/octocat" + api_url= "https://api.github.com" + client = Faraday.new(url: api_url) + client.options["open_timeout"] = 1 + client.options["timeout"] = 1 + client.options["write_timeout"] = 1 + client.headers["Authorization"] = "Bearer #{@token}" + response = client.public_send("get", url) + @success = true if response.status == 200 + end + + def gitlab_verify + url = "/api/v4/projects" + api_url= "https://gitlab.com" + client = Faraday.new(url: api_url) + client.options["open_timeout"] = 1 + client.options["timeout"] = 1 + client.options["write_timeout"] = 1 + req_params={ + private_token: @token + } + response = client.public_send("get", url, req_params) + @success = true if response.status == 200 + end +end \ No newline at end of file diff --git a/app/services/pull_requests/send_journal_service.rb b/app/services/pull_requests/send_journal_service.rb index 17f6fdabd..578faa4b9 100644 --- a/app/services/pull_requests/send_journal_service.rb +++ b/app/services/pull_requests/send_journal_service.rb @@ -20,7 +20,7 @@ class PullRequests::SendJournalService < ApplicationService journalized_id: @issue.id , journalized_type: "Issue", user_id: sender_id , - notes: "@#{@current_user.nickname} 您好!欢迎参与 #{@project.name} 的贡献。首次进行贡献请完成《#{@project.owner.cla.name}》的签署,签署完成后,项目成员才可查看到您的合并请求", + notes: "#{@current_user.nickname}您好!欢迎参与 #{@project.name} 的贡献。首次进行贡献请完成《#{@project.owner.cla.name}》的签署,签署完成后,项目成员才可查看到您的合并请求", } journal = Journal.new journal_params if journal.save diff --git a/app/views/users/clas/_detail.json.jbuilder b/app/views/users/clas/_detail.json.jbuilder index 5b6d246e5..106145f6e 100644 --- a/app/views/users/clas/_detail.json.jbuilder +++ b/app/views/users/clas/_detail.json.jbuilder @@ -2,7 +2,7 @@ json.id user_cla.id json.real_name user_cla.real_name json.email user_cla.email json.state user_cla.state -json.created_at format_time(user_cla.created_at) +json.created_at format_time(user_cla.sign_time) json.cla do json.partial! "/organizations/clas/detail", locals: {cla: user_cla.cla} end diff --git a/config/routes.rb b/config/routes.rb index 90526f9e6..0d04c498a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -241,6 +241,7 @@ Rails.application.routes.draw do get :group_type_list get :recommend get :banner_recommend + post :verify_auth_token end end diff --git a/db/migrate/20230620030511_add_sign_time_to_user_clas.rb b/db/migrate/20230620030511_add_sign_time_to_user_clas.rb new file mode 100644 index 000000000..f913f244f --- /dev/null +++ b/db/migrate/20230620030511_add_sign_time_to_user_clas.rb @@ -0,0 +1,5 @@ +class AddSignTimeToUserClas < ActiveRecord::Migration[5.2] + def change + add_column :user_clas, :sign_time, :datetime + end +end From 1b09c93b5e0198c2e89805c5696959d48d1eb14c Mon Sep 17 00:00:00 2001 From: chenjing Date: Tue, 20 Jun 2023 15:50:11 +0800 Subject: [PATCH 086/233] change verify token response --- app/controllers/projects_controller.rb | 6 +----- app/services/projects/verify_auth_token_service.rb | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index e5dc7103a..04982d8ce 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -65,11 +65,7 @@ class ProjectsController < ApplicationController def verify_auth_token data = Projects::VerifyAuthTokenService.call(params[:clone_addr], params[:auth_token]) - if data - render_ok - else - render_error('token验证不通过') - end + render_ok({data: data}) end def migrate diff --git a/app/services/projects/verify_auth_token_service.rb b/app/services/projects/verify_auth_token_service.rb index 1318bb9db..36dcb106f 100644 --- a/app/services/projects/verify_auth_token_service.rb +++ b/app/services/projects/verify_auth_token_service.rb @@ -7,7 +7,7 @@ class Projects::VerifyAuthTokenService < ApplicationService @repo = nil @owner = nil @website = nil - @success = nil + @success = false end def call From f9a02c3bd6c133ed7389b84c709d4db18a260d54 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Wed, 21 Jun 2023 16:32:58 +0800 Subject: [PATCH 087/233] =?UTF-8?q?=E5=90=8E=E5=8F=B0js=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...fest-fcdcb36eff7e19f6646153ed2fcfd2b4.json | 2 +- ...3c1929ff7aa9e12cd1313f9e1b7292fa406470.css | 42 + ...929ff7aa9e12cd1313f9e1b7292fa406470.css.gz | Bin 0 -> 59480 bytes ...16fb687dab371f3c6c8414daffe341ab264ab2c.js | 140360 +++++++++++++++ ...b687dab371f3c6c8414daffe341ab264ab2c.js.gz | Bin 0 -> 993700 bytes 5 files changed, 140403 insertions(+), 1 deletion(-) create mode 100644 public/assets/admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css create mode 100644 public/assets/admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css.gz create mode 100644 public/assets/admin-ac55ef6d0ab68e7b7fc33b36616fb687dab371f3c6c8414daffe341ab264ab2c.js create mode 100644 public/assets/admin-ac55ef6d0ab68e7b7fc33b36616fb687dab371f3c6c8414daffe341ab264ab2c.js.gz diff --git a/public/assets/.sprockets-manifest-fcdcb36eff7e19f6646153ed2fcfd2b4.json b/public/assets/.sprockets-manifest-fcdcb36eff7e19f6646153ed2fcfd2b4.json index 54809c488..c74087f04 100644 --- a/public/assets/.sprockets-manifest-fcdcb36eff7e19f6646153ed2fcfd2b4.json +++ b/public/assets/.sprockets-manifest-fcdcb36eff7e19f6646153ed2fcfd2b4.json @@ -1 +1 @@ -{"files":{"admin-3e4fde7de877298349280a53b1de578b155575be742d34a72de7574db7f26219.js":{"logical_path":"admin.js","mtime":"2022-09-02T16:02:23+08:00","size":4587814,"digest":"3e4fde7de877298349280a53b1de578b155575be742d34a72de7574db7f26219","integrity":"sha256-Pk/efeh3KYNJKApTsd5XixVVdb50LTSnLedXTbfyYhk="},"admin-5fa03af0e91aea5a8125dc7a7bb31e7a8c4d0a480e2c09ccc7b6db230063c555.css":{"logical_path":"admin.css","mtime":"2022-09-02T16:02:23+08:00","size":369866,"digest":"5fa03af0e91aea5a8125dc7a7bb31e7a8c4d0a480e2c09ccc7b6db230063c555","integrity":"sha256-X6A68Oka6lqBJdx6e7MeeoxNCkgOLAnMx7bbIwBjxVU="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2021-11-24T09:25:49+08:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2021-11-24T09:25:49+08:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2021-11-24T09:25:49+08:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2021-11-24T09:25:49+08:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2021-11-24T09:25:49+08:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"college-f9c1b76699b39750bee976e1dbb5d832fdce2fb05edaf1b818c6e76fdf5ba77c.js":{"logical_path":"college.js","mtime":"2022-09-02T16:02:23+08:00","size":3505839,"digest":"f9c1b76699b39750bee976e1dbb5d832fdce2fb05edaf1b818c6e76fdf5ba77c","integrity":"sha256-+cG3Zpmzl1C+6Xbh27XYMv3OL7Be2vG4GMbnb99bp3w="},"college-fe5b44c2d2fe8fcd24143a2cb9df8254be9104d3fe4e3da0f3e3317838a16ebc.css":{"logical_path":"college.css","mtime":"2022-02-22T09:55:36+08:00","size":218568,"digest":"fe5b44c2d2fe8fcd24143a2cb9df8254be9104d3fe4e3da0f3e3317838a16ebc","integrity":"sha256-/ltEwtL+j80kFDosud+CVL6RBNP+Tj2g8+MxeDihbrw="},"cooperative-2efdf753e39599e78fb02527e864784df9a34dd971576db8231b63f618f9786e.js":{"logical_path":"cooperative.js","mtime":"2022-09-02T16:02:23+08:00","size":4413858,"digest":"2efdf753e39599e78fb02527e864784df9a34dd971576db8231b63f618f9786e","integrity":"sha256-Lv33U+OVmeePsCUn6GR4TfmjTdlxV224Ixtj9hj5eG4="},"cooperative-cf4adc259ee46508f0fba0ccaa4f2c3beb33dbb715cc354ec30fbb7db729ca77.css":{"logical_path":"cooperative.css","mtime":"2022-02-22T09:55:38+08:00","size":354672,"digest":"cf4adc259ee46508f0fba0ccaa4f2c3beb33dbb715cc354ec30fbb7db729ca77","integrity":"sha256-z0rcJZ7kZQjw+6DMqk8sO+sz27cVzDVOww+7fbcpync="},"oauth-79ad9eb7fd1c8cc81aed569f2c933d0bbd5a823dc450a1038c034eef2a7b6b9c.css":{"logical_path":"oauth.css","mtime":"2022-02-22T09:55:36+08:00","size":1497,"digest":"79ad9eb7fd1c8cc81aed569f2c933d0bbd5a823dc450a1038c034eef2a7b6b9c","integrity":"sha256-ea2et/0cjMga7VafLJM9C71agj3EUKEDjANO7yp7a5w="},"logo-9d97159b1c6619af9d667616b4da0ef43201f45d82b3f591c93fcd5f233da2c9.png":{"logical_path":"logo.png","mtime":"2022-08-17T10:08:33+08:00","size":10051,"digest":"9d97159b1c6619af9d667616b4da0ef43201f45d82b3f591c93fcd5f233da2c9","integrity":"sha256-nZcVmxxmGa+dZnYWtNoO9DIB9F2Cs/WRyT/NXyM9osk="},"application-1852bb2a261b8a9ce0d4a83dcc076d63be1105549c174f335c1e0f466fa9f8c1.js":{"logical_path":"application.js","mtime":"2022-09-02T16:02:23+08:00","size":1197927,"digest":"1852bb2a261b8a9ce0d4a83dcc076d63be1105549c174f335c1e0f466fa9f8c1","integrity":"sha256-GFK7KiYbipzg1Kg9zAdtY74RBVScF08zXB4PRm+p+ME="},"bootstrap/bootstrap-toggle.min.js-fac504e43bc81af46909bd71548406af8a8fee086aa3e6d0ef86fe93cafbc650.map":{"logical_path":"bootstrap/bootstrap-toggle.min.js.map","mtime":"2022-09-02T16:02:23+08:00","size":4106,"digest":"fac504e43bc81af46909bd71548406af8a8fee086aa3e6d0ef86fe93cafbc650","integrity":"sha256-+sUE5DvIGvRpCb1xVIQGr4qP7ghqo+bQ74b+k8r7xlA="},"bootstrap/bootstrap2-toggle.min.js-b3598be8ca2991d3ae918a855c3b506702ddafb35ae5178f36473f2705ec4a9c.map":{"logical_path":"bootstrap/bootstrap2-toggle.min.js.map","mtime":"2022-09-02T16:02:23+08:00","size":4094,"digest":"b3598be8ca2991d3ae918a855c3b506702ddafb35ae5178f36473f2705ec4a9c","integrity":"sha256-s1mL6MopkdOukYqFXDtQZwLdr7Na5RePNkc/JwXsSpw="},"application-346b678500708f3f4e9cd72c46d1e9e54aaf76e0478b766519ac083bf93fbcff.css":{"logical_path":"application.css","mtime":"2022-02-22T09:55:36+08:00","size":159095,"digest":"346b678500708f3f4e9cd72c46d1e9e54aaf76e0478b766519ac083bf93fbcff","integrity":"sha256-NGtnhQBwjz9OnNcsRtHp5UqvduBHi3ZlGawIO/k/vP8="},"doorkeeper/admin/application-1eab3051577b4137493a81db2c1b5146dc370789f916a7db66673c7d155fce3c.css":{"logical_path":"doorkeeper/admin/application.css","mtime":"2022-07-11T17:10:38+08:00","size":135395,"digest":"1eab3051577b4137493a81db2c1b5146dc370789f916a7db66673c7d155fce3c","integrity":"sha256-HqswUVd7QTdJOoHbLBtRRtw3B4n5FqfbZmc8fRVfzjw="},"doorkeeper/application-748b4778af3565a0e8fab819af79f8a5005b95c49d8ae35a436e4a1a4bcdfb86.css":{"logical_path":"doorkeeper/application.css","mtime":"2022-07-11T17:10:38+08:00","size":135960,"digest":"748b4778af3565a0e8fab819af79f8a5005b95c49d8ae35a436e4a1a4bcdfb86","integrity":"sha256-dItHeK81ZaDo+rgZr3n4pQBblcSdiuNaQ25KGkvN+4Y="}},"assets":{"admin.js":"admin-3e4fde7de877298349280a53b1de578b155575be742d34a72de7574db7f26219.js","admin.css":"admin-5fa03af0e91aea5a8125dc7a7bb31e7a8c4d0a480e2c09ccc7b6db230063c555.css","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","college.js":"college-f9c1b76699b39750bee976e1dbb5d832fdce2fb05edaf1b818c6e76fdf5ba77c.js","college.css":"college-fe5b44c2d2fe8fcd24143a2cb9df8254be9104d3fe4e3da0f3e3317838a16ebc.css","cooperative.js":"cooperative-2efdf753e39599e78fb02527e864784df9a34dd971576db8231b63f618f9786e.js","cooperative.css":"cooperative-cf4adc259ee46508f0fba0ccaa4f2c3beb33dbb715cc354ec30fbb7db729ca77.css","oauth.css":"oauth-79ad9eb7fd1c8cc81aed569f2c933d0bbd5a823dc450a1038c034eef2a7b6b9c.css","logo.png":"logo-9d97159b1c6619af9d667616b4da0ef43201f45d82b3f591c93fcd5f233da2c9.png","application.js":"application-1852bb2a261b8a9ce0d4a83dcc076d63be1105549c174f335c1e0f466fa9f8c1.js","bootstrap/bootstrap-toggle.min.js.map":"bootstrap/bootstrap-toggle.min.js-fac504e43bc81af46909bd71548406af8a8fee086aa3e6d0ef86fe93cafbc650.map","bootstrap/bootstrap2-toggle.min.js.map":"bootstrap/bootstrap2-toggle.min.js-b3598be8ca2991d3ae918a855c3b506702ddafb35ae5178f36473f2705ec4a9c.map","application.css":"application-346b678500708f3f4e9cd72c46d1e9e54aaf76e0478b766519ac083bf93fbcff.css","doorkeeper/admin/application.css":"doorkeeper/admin/application-1eab3051577b4137493a81db2c1b5146dc370789f916a7db66673c7d155fce3c.css","doorkeeper/application.css":"doorkeeper/application-748b4778af3565a0e8fab819af79f8a5005b95c49d8ae35a436e4a1a4bcdfb86.css"}} \ No newline at end of file +{"files":{"admin-3e4fde7de877298349280a53b1de578b155575be742d34a72de7574db7f26219.js":{"logical_path":"admin.js","mtime":"2022-09-02T16:02:23+08:00","size":4587814,"digest":"3e4fde7de877298349280a53b1de578b155575be742d34a72de7574db7f26219","integrity":"sha256-Pk/efeh3KYNJKApTsd5XixVVdb50LTSnLedXTbfyYhk="},"admin-5fa03af0e91aea5a8125dc7a7bb31e7a8c4d0a480e2c09ccc7b6db230063c555.css":{"logical_path":"admin.css","mtime":"2022-09-02T16:02:23+08:00","size":369866,"digest":"5fa03af0e91aea5a8125dc7a7bb31e7a8c4d0a480e2c09ccc7b6db230063c555","integrity":"sha256-X6A68Oka6lqBJdx6e7MeeoxNCkgOLAnMx7bbIwBjxVU="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2021-11-16T13:43:10+08:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2021-11-16T13:43:10+08:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2021-11-16T13:43:10+08:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2021-11-16T13:43:10+08:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2021-11-16T13:43:10+08:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"college-f9c1b76699b39750bee976e1dbb5d832fdce2fb05edaf1b818c6e76fdf5ba77c.js":{"logical_path":"college.js","mtime":"2023-06-21T16:19:54+08:00","size":3505839,"digest":"f9c1b76699b39750bee976e1dbb5d832fdce2fb05edaf1b818c6e76fdf5ba77c","integrity":"sha256-+cG3Zpmzl1C+6Xbh27XYMv3OL7Be2vG4GMbnb99bp3w="},"college-fe5b44c2d2fe8fcd24143a2cb9df8254be9104d3fe4e3da0f3e3317838a16ebc.css":{"logical_path":"college.css","mtime":"2022-02-22T09:55:36+08:00","size":218568,"digest":"fe5b44c2d2fe8fcd24143a2cb9df8254be9104d3fe4e3da0f3e3317838a16ebc","integrity":"sha256-/ltEwtL+j80kFDosud+CVL6RBNP+Tj2g8+MxeDihbrw="},"cooperative-2efdf753e39599e78fb02527e864784df9a34dd971576db8231b63f618f9786e.js":{"logical_path":"cooperative.js","mtime":"2023-06-21T16:19:54+08:00","size":4413858,"digest":"2efdf753e39599e78fb02527e864784df9a34dd971576db8231b63f618f9786e","integrity":"sha256-Lv33U+OVmeePsCUn6GR4TfmjTdlxV224Ixtj9hj5eG4="},"cooperative-cf4adc259ee46508f0fba0ccaa4f2c3beb33dbb715cc354ec30fbb7db729ca77.css":{"logical_path":"cooperative.css","mtime":"2022-02-22T09:55:38+08:00","size":354672,"digest":"cf4adc259ee46508f0fba0ccaa4f2c3beb33dbb715cc354ec30fbb7db729ca77","integrity":"sha256-z0rcJZ7kZQjw+6DMqk8sO+sz27cVzDVOww+7fbcpync="},"oauth-79ad9eb7fd1c8cc81aed569f2c933d0bbd5a823dc450a1038c034eef2a7b6b9c.css":{"logical_path":"oauth.css","mtime":"2022-02-22T09:55:36+08:00","size":1497,"digest":"79ad9eb7fd1c8cc81aed569f2c933d0bbd5a823dc450a1038c034eef2a7b6b9c","integrity":"sha256-ea2et/0cjMga7VafLJM9C71agj3EUKEDjANO7yp7a5w="},"logo-9d97159b1c6619af9d667616b4da0ef43201f45d82b3f591c93fcd5f233da2c9.png":{"logical_path":"logo.png","mtime":"2023-05-31T17:17:47+08:00","size":10051,"digest":"9d97159b1c6619af9d667616b4da0ef43201f45d82b3f591c93fcd5f233da2c9","integrity":"sha256-nZcVmxxmGa+dZnYWtNoO9DIB9F2Cs/WRyT/NXyM9osk="},"application-1852bb2a261b8a9ce0d4a83dcc076d63be1105549c174f335c1e0f466fa9f8c1.js":{"logical_path":"application.js","mtime":"2023-06-21T16:19:54+08:00","size":1197927,"digest":"1852bb2a261b8a9ce0d4a83dcc076d63be1105549c174f335c1e0f466fa9f8c1","integrity":"sha256-GFK7KiYbipzg1Kg9zAdtY74RBVScF08zXB4PRm+p+ME="},"bootstrap/bootstrap-toggle.min.js-fac504e43bc81af46909bd71548406af8a8fee086aa3e6d0ef86fe93cafbc650.map":{"logical_path":"bootstrap/bootstrap-toggle.min.js.map","mtime":"2023-05-31T17:17:47+08:00","size":4106,"digest":"fac504e43bc81af46909bd71548406af8a8fee086aa3e6d0ef86fe93cafbc650","integrity":"sha256-+sUE5DvIGvRpCb1xVIQGr4qP7ghqo+bQ74b+k8r7xlA="},"bootstrap/bootstrap2-toggle.min.js-b3598be8ca2991d3ae918a855c3b506702ddafb35ae5178f36473f2705ec4a9c.map":{"logical_path":"bootstrap/bootstrap2-toggle.min.js.map","mtime":"2023-05-31T17:17:47+08:00","size":4094,"digest":"b3598be8ca2991d3ae918a855c3b506702ddafb35ae5178f36473f2705ec4a9c","integrity":"sha256-s1mL6MopkdOukYqFXDtQZwLdr7Na5RePNkc/JwXsSpw="},"application-346b678500708f3f4e9cd72c46d1e9e54aaf76e0478b766519ac083bf93fbcff.css":{"logical_path":"application.css","mtime":"2022-02-22T09:55:36+08:00","size":159095,"digest":"346b678500708f3f4e9cd72c46d1e9e54aaf76e0478b766519ac083bf93fbcff","integrity":"sha256-NGtnhQBwjz9OnNcsRtHp5UqvduBHi3ZlGawIO/k/vP8="},"doorkeeper/admin/application-1eab3051577b4137493a81db2c1b5146dc370789f916a7db66673c7d155fce3c.css":{"logical_path":"doorkeeper/admin/application.css","mtime":"2022-09-01T11:37:27+08:00","size":135395,"digest":"1eab3051577b4137493a81db2c1b5146dc370789f916a7db66673c7d155fce3c","integrity":"sha256-HqswUVd7QTdJOoHbLBtRRtw3B4n5FqfbZmc8fRVfzjw="},"doorkeeper/application-748b4778af3565a0e8fab819af79f8a5005b95c49d8ae35a436e4a1a4bcdfb86.css":{"logical_path":"doorkeeper/application.css","mtime":"2022-09-01T11:37:27+08:00","size":135960,"digest":"748b4778af3565a0e8fab819af79f8a5005b95c49d8ae35a436e4a1a4bcdfb86","integrity":"sha256-dItHeK81ZaDo+rgZr3n4pQBblcSdiuNaQ25KGkvN+4Y="},"admin-ac55ef6d0ab68e7b7fc33b36616fb687dab371f3c6c8414daffe341ab264ab2c.js":{"logical_path":"admin.js","mtime":"2023-06-21T16:19:54+08:00","size":4590295,"digest":"ac55ef6d0ab68e7b7fc33b36616fb687dab371f3c6c8414daffe341ab264ab2c","integrity":"sha256-rFXvbQq2jnt/wzs2YW+2h9qzcfPGyEFNr/40GrJkqyw="},"admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css":{"logical_path":"admin.css","mtime":"2023-06-21T16:19:00+08:00","size":369999,"digest":"a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470","integrity":"sha256-p+36AT9egixDrBofgTwZKf96qeEs0TE/nhtykvpAZHA="}},"assets":{"admin.js":"admin-ac55ef6d0ab68e7b7fc33b36616fb687dab371f3c6c8414daffe341ab264ab2c.js","admin.css":"admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","college.js":"college-f9c1b76699b39750bee976e1dbb5d832fdce2fb05edaf1b818c6e76fdf5ba77c.js","college.css":"college-fe5b44c2d2fe8fcd24143a2cb9df8254be9104d3fe4e3da0f3e3317838a16ebc.css","cooperative.js":"cooperative-2efdf753e39599e78fb02527e864784df9a34dd971576db8231b63f618f9786e.js","cooperative.css":"cooperative-cf4adc259ee46508f0fba0ccaa4f2c3beb33dbb715cc354ec30fbb7db729ca77.css","oauth.css":"oauth-79ad9eb7fd1c8cc81aed569f2c933d0bbd5a823dc450a1038c034eef2a7b6b9c.css","logo.png":"logo-9d97159b1c6619af9d667616b4da0ef43201f45d82b3f591c93fcd5f233da2c9.png","application.js":"application-1852bb2a261b8a9ce0d4a83dcc076d63be1105549c174f335c1e0f466fa9f8c1.js","bootstrap/bootstrap-toggle.min.js.map":"bootstrap/bootstrap-toggle.min.js-fac504e43bc81af46909bd71548406af8a8fee086aa3e6d0ef86fe93cafbc650.map","bootstrap/bootstrap2-toggle.min.js.map":"bootstrap/bootstrap2-toggle.min.js-b3598be8ca2991d3ae918a855c3b506702ddafb35ae5178f36473f2705ec4a9c.map","application.css":"application-346b678500708f3f4e9cd72c46d1e9e54aaf76e0478b766519ac083bf93fbcff.css","doorkeeper/admin/application.css":"doorkeeper/admin/application-1eab3051577b4137493a81db2c1b5146dc370789f916a7db66673c7d155fce3c.css","doorkeeper/application.css":"doorkeeper/application-748b4778af3565a0e8fab819af79f8a5005b95c49d8ae35a436e4a1a4bcdfb86.css"}} \ No newline at end of file diff --git a/public/assets/admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css b/public/assets/admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css new file mode 100644 index 000000000..905f56225 --- /dev/null +++ b/public/assets/admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css @@ -0,0 +1,42 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #007bff;--secondary: #6c757d;--success: #28a745;--info: #17a2b8;--warning: #ffc107;--danger: #dc3545;--light: #f8f9fa;--dark: #343a40;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:0.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:0.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:0.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:0.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:0.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:0.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:0.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:0.2rem 0.4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:0.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;-webkit-box-flex:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;flex:0 0 auto;width:auto;max-width:100%}.col-1{-webkit-box-flex:0;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-webkit-box-flex:0;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{-webkit-box-flex:0;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{-webkit-box-flex:0;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-webkit-box-flex:0;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-webkit-box-flex:0;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{-webkit-box-flex:0;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{-webkit-box-flex:0;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;order:-1}.order-last{-webkit-box-ordinal-group:14;order:13}.order-0{-webkit-box-ordinal-group:1;order:0}.order-1{-webkit-box-ordinal-group:2;order:1}.order-2{-webkit-box-ordinal-group:3;order:2}.order-3{-webkit-box-ordinal-group:4;order:3}.order-4{-webkit-box-ordinal-group:5;order:4}.order-5{-webkit-box-ordinal-group:6;order:5}.order-6{-webkit-box-ordinal-group:7;order:6}.order-7{-webkit-box-ordinal-group:8;order:7}.order-8{-webkit-box-ordinal-group:9;order:8}.order-9{-webkit-box-ordinal-group:10;order:9}.order-10{-webkit-box-ordinal-group:11;order:10}.order-11{-webkit-box-ordinal-group:12;order:11}.order-12{-webkit-box-ordinal-group:13;order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width: 576px){.col-sm{flex-basis:0;-webkit-box-flex:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-webkit-box-flex:0;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;order:13}.order-sm-0{-webkit-box-ordinal-group:1;order:0}.order-sm-1{-webkit-box-ordinal-group:2;order:1}.order-sm-2{-webkit-box-ordinal-group:3;order:2}.order-sm-3{-webkit-box-ordinal-group:4;order:3}.order-sm-4{-webkit-box-ordinal-group:5;order:4}.order-sm-5{-webkit-box-ordinal-group:6;order:5}.order-sm-6{-webkit-box-ordinal-group:7;order:6}.order-sm-7{-webkit-box-ordinal-group:8;order:7}.order-sm-8{-webkit-box-ordinal-group:9;order:8}.order-sm-9{-webkit-box-ordinal-group:10;order:9}.order-sm-10{-webkit-box-ordinal-group:11;order:10}.order-sm-11{-webkit-box-ordinal-group:12;order:11}.order-sm-12{-webkit-box-ordinal-group:13;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width: 768px){.col-md{flex-basis:0;-webkit-box-flex:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-webkit-box-flex:0;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;order:-1}.order-md-last{-webkit-box-ordinal-group:14;order:13}.order-md-0{-webkit-box-ordinal-group:1;order:0}.order-md-1{-webkit-box-ordinal-group:2;order:1}.order-md-2{-webkit-box-ordinal-group:3;order:2}.order-md-3{-webkit-box-ordinal-group:4;order:3}.order-md-4{-webkit-box-ordinal-group:5;order:4}.order-md-5{-webkit-box-ordinal-group:6;order:5}.order-md-6{-webkit-box-ordinal-group:7;order:6}.order-md-7{-webkit-box-ordinal-group:8;order:7}.order-md-8{-webkit-box-ordinal-group:9;order:8}.order-md-9{-webkit-box-ordinal-group:10;order:9}.order-md-10{-webkit-box-ordinal-group:11;order:10}.order-md-11{-webkit-box-ordinal-group:12;order:11}.order-md-12{-webkit-box-ordinal-group:13;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width: 992px){.col-lg{flex-basis:0;-webkit-box-flex:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-webkit-box-flex:0;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;order:13}.order-lg-0{-webkit-box-ordinal-group:1;order:0}.order-lg-1{-webkit-box-ordinal-group:2;order:1}.order-lg-2{-webkit-box-ordinal-group:3;order:2}.order-lg-3{-webkit-box-ordinal-group:4;order:3}.order-lg-4{-webkit-box-ordinal-group:5;order:4}.order-lg-5{-webkit-box-ordinal-group:6;order:5}.order-lg-6{-webkit-box-ordinal-group:7;order:6}.order-lg-7{-webkit-box-ordinal-group:8;order:7}.order-lg-8{-webkit-box-ordinal-group:9;order:8}.order-lg-9{-webkit-box-ordinal-group:10;order:9}.order-lg-10{-webkit-box-ordinal-group:11;order:10}.order-lg-11{-webkit-box-ordinal-group:12;order:11}.order-lg-12{-webkit-box-ordinal-group:13;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width: 1200px){.col-xl{flex-basis:0;-webkit-box-flex:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-webkit-box-flex:0;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;order:13}.order-xl-0{-webkit-box-ordinal-group:1;order:0}.order-xl-1{-webkit-box-ordinal-group:2;order:1}.order-xl-2{-webkit-box-ordinal-group:3;order:2}.order-xl-3{-webkit-box-ordinal-group:4;order:3}.order-xl-4{-webkit-box-ordinal-group:5;order:4}.order-xl-5{-webkit-box-ordinal-group:6;order:5}.order-xl-6{-webkit-box-ordinal-group:7;order:6}.order-xl-7{-webkit-box-ordinal-group:8;order:7}.order-xl-8{-webkit-box-ordinal-group:9;order:8}.order-xl-9{-webkit-box-ordinal-group:10;order:9}.order-xl-10{-webkit-box-ordinal-group:11;order:10}.order-xl-11{-webkit-box-ordinal-group:12;order:11}.order-xl-12{-webkit-box-ordinal-group:13;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table th,.table td{padding:0.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#b8daff}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#c3e6cb}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffeeba}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>th,.table-danger>td{background-color:#f5c6cb}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark th,.table-dark td,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:0.25rem;-webkit-transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 0.2rem rgba(0,123,255,0.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:0.375rem;padding-bottom:0.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:0.25rem}.form-row{display:-webkit-box;display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:0.3rem;margin-left:-1.25rem}.form-check-input:disabled ~ .form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:inline-flex;-webkit-box-align:center;align-items:center;padding-left:0;margin-right:0.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:0.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,0.9);border-radius:0.25rem}.was-validated .form-control:valid,.form-control.is-valid{border-color:#28a745;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(0.375em + 0.1875rem);background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 0.2rem rgba(40,167,69,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#28a745;padding-right:calc((1em + 0.75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 0.2rem rgba(40,167,69,0.25)}.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control-file:valid ~ .valid-feedback,.was-validated .form-control-file:valid ~ .valid-tooltip,.form-control-file.is-valid ~ .valid-feedback,.form-control-file.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#28a745}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#28a745}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{border-color:#28a745}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{box-shadow:0 0 0 0.2rem rgba(40,167,69,0.25)}.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before{border-color:#28a745}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#28a745}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{border-color:#28a745;box-shadow:0 0 0 0.2rem rgba(40,167,69,0.25)}.invalid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,0.9);border-radius:0.25rem}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(0.375em + 0.1875rem);background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 0.2rem rgba(220,53,69,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#dc3545;padding-right:calc((1em + 0.75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 0.2rem rgba(220,53,69,0.25)}.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control-file:invalid ~ .invalid-feedback,.was-validated .form-control-file:invalid ~ .invalid-tooltip,.form-control-file.is-invalid ~ .invalid-feedback,.form-control-file.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#dc3545}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#dc3545}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{border-color:#dc3545}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{box-shadow:0 0 0 0.2rem rgba(220,53,69,0.25)}.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before{border-color:#dc3545}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#dc3545}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{border-color:#dc3545;box-shadow:0 0 0 0.2rem rgba(220,53,69,0.25)}.form-inline{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;-webkit-box-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:flex;-webkit-box-flex:0;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;-webkit-box-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:0.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:0.375rem 0.75rem;font-size:1rem;line-height:1.5;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{-webkit-transition:none;transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(0,123,255,0.25)}.btn.disabled,.btn:disabled{opacity:0.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary:focus,.btn-primary.focus{box-shadow:0 0 0 0.2rem rgba(38,143,255,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(38,143,255,0.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{box-shadow:0 0 0 0.2rem rgba(130,138,145,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(130,138,145,0.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 0.2rem rgba(72,180,97,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(72,180,97,0.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{box-shadow:0 0 0 0.2rem rgba(58,176,195,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(58,176,195,0.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning:focus,.btn-warning.focus{box-shadow:0 0 0 0.2rem rgba(222,170,12,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(222,170,12,0.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger:focus,.btn-danger.focus{box-shadow:0 0 0 0.2rem rgba(225,83,97,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(225,83,97,0.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{box-shadow:0 0 0 0.2rem rgba(216,217,219,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(216,217,219,0.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{box-shadow:0 0 0 0.2rem rgba(82,88,93,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(82,88,93,0.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 0.2rem rgba(0,123,255,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(0,123,255,0.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 0.2rem rgba(108,117,125,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(108,117,125,0.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 0.2rem rgba(40,167,69,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(40,167,69,0.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 0.2rem rgba(23,162,184,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(23,162,184,0.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 0.2rem rgba(255,193,7,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(255,193,7,0.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 0.2rem rgba(220,53,69,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(220,53,69,0.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#6c757d;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}.btn-sm,.btn-group-sm>.btn{padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:0.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{-webkit-transition:none;transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid;border-right:0.3em solid transparent;border-bottom:0;border-left:0.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:0.5rem 0;margin:0.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:0.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:0.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0;border-right:0.3em solid transparent;border-bottom:0.3em solid;border-left:0.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:0.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0;border-bottom:0.3em solid transparent;border-left:0.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:0.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0.3em solid;border-bottom:0.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^="top"],.dropdown-menu[x-placement^="right"],.dropdown-menu[x-placement^="bottom"],.dropdown-menu[x-placement^="left"]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:0.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:0.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:0.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:1;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:-webkit-box;display:flex;flex-wrap:wrap;-webkit-box-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:0.5625rem;padding-left:0.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-align:start;align-items:flex-start;-webkit-box-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:flex;flex-wrap:wrap;-webkit-box-align:stretch;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;-webkit-box-flex:1;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus ~ .custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:-webkit-box;display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;padding:0.375rem 0.75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:0.25rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:0 0 0 0.2rem rgba(0,123,255,0.25)}.custom-control-input:focus:not(:checked) ~ .custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active ~ .custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled ~ .custom-control-label{color:#6c757d}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:0.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:0.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50% / 50% 50%}.custom-checkbox .custom-control-label::before{border-radius:0.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:0.5rem}.custom-switch .custom-control-label::after{top:calc(0.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:0.5rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{-webkit-transition:none;transition:none}}.custom-switch .custom-control-input:checked ~ .custom-control-label::after{background-color:#fff;-webkit-transform:translateX(0.75rem);transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 1.75rem 0.375rem 0.75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 0.2rem rgba(0,123,255,0.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:0.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:0.25rem;padding-bottom:0.25rem;padding-left:0.5rem;font-size:0.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:0.5rem;padding-bottom:0.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + 0.75rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-label{border-color:#80bdff;box-shadow:0 0 0 0.2rem rgba(0,123,255,0.25)}.custom-file-input:disabled ~ .custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-input ~ .custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 0.75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:0.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + 0.75rem);padding:0.375rem 0.75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 0.25rem 0.25rem 0}.custom-range{width:100%;height:calc(1rem + 0.4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(0,123,255,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(0,123,255,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(0,123,255,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:0.2rem;margin-left:0.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:0.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:0.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:0.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;-webkit-box-flex:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:flex;flex-wrap:wrap;-webkit-box-align:center;align-items:center;-webkit-box-pack:justify;justify-content:space-between;padding:0.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:flex;flex-wrap:wrap;-webkit-box-align:center;align-items:center;-webkit-box-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:0.3125rem;padding-bottom:0.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:0.5rem;padding-bottom:0.5rem}.navbar-collapse{flex-basis:100%;-webkit-box-flex:1;flex-grow:1;-webkit-box-align:center;align-items:center}.navbar-toggler{padding:0.25rem 0.75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:0.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box !important;display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:0.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.card-body{-webkit-box-flex:1;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:0.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:0.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:0.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(0.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:0.75rem}@media (min-width: 576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-webkit-box;display:flex;flex-wrap:wrap;padding:0.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:0.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:0.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:0.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:flex;padding-left:0;list-style:none;border-radius:0.25rem}.page-link{position:relative;display:block;padding:0.5rem 0.75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 0.2rem rgba(0,123,255,0.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem}.page-item:last-child .page-link{border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:0.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:0.3rem;border-bottom-left-radius:0.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:0.3rem;border-bottom-right-radius:0.3rem}.pagination-sm .page-link{padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:0.2rem;border-bottom-left-radius:0.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:0.2rem;border-bottom-right-radius:0.2rem}.badge{display:inline-block;padding:0.25em 0.4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.badge{-webkit-transition:none;transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:0.6em;padding-left:0.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#0062cc}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(0,123,255,0.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#545b62}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(108,117,125,0.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#1e7e34}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(40,167,69,0.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#117a8b}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(23,162,184,0.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#d39e00}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(255,193,7,0.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#bd2130}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(220,53,69,0.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#dae0e5}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#1d2124}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:0.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:0.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:0.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:0.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:flex;height:1rem;overflow:hidden;font-size:0.75rem;background-color:#e9ecef;border-radius:0.25rem}.progress-bar{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion: reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-webkit-box;display:flex;-webkit-box-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;flex:1}.list-group{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:0.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem;border-bottom-left-radius:0}@media (min-width: 576px){.list-group-horizontal-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem;border-bottom-left-radius:0}}@media (min-width: 768px){.list-group-horizontal-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem;border-bottom-left-radius:0}}@media (min-width: 992px){.list-group-horizontal-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem;border-bottom-left-radius:0}}@media (min-width: 1200px){.list-group-horizontal-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:0.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:0.25rem}.toast:not(:last-child){margin-bottom:0.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;padding:0.25rem 0.75rem;color:#6c757d;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05)}.toast-body{padding:0.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:0.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform 0.3s ease-out;transition:-webkit-transform 0.3s ease-out;transition:transform 0.3s ease-out;transition:transform 0.3s ease-out, -webkit-transform 0.3s ease-out;-webkit-transform:translate(0, -50px);transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-webkit-box;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:0.5}.modal-header{display:-webkit-box;display:flex;-webkit-box-align:start;align-items:flex-start;-webkit-box-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:0.3rem;border-top-right-radius:0.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:0.3rem;border-bottom-left-radius:0.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:0.9}.tooltip .arrow{position:absolute;display:block;width:0.8rem;height:0.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:0.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:0.4rem 0.4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 0.4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:0.4rem;height:0.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:0.4rem 0.4rem 0.4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:0.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 0.4rem 0.4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 0.4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:0.4rem;height:0.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:0.4rem 0 0.4rem 0.4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:0.25rem 0.5rem;color:#fff;text-align:center;background-color:#000;border-radius:0.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:0.5rem;margin:0 0.3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:0.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^="top"]>.arrow{bottom:calc((0.5rem + 1px) * -1)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^="top"]>.arrow::before{bottom:0;border-width:0.5rem 0.5rem 0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^="top"]>.arrow::after{bottom:1px;border-width:0.5rem 0.5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:0.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^="right"]>.arrow{left:calc((0.5rem + 1px) * -1);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^="right"]>.arrow::before{left:0;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^="right"]>.arrow::after{left:1px;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:0.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^="bottom"]>.arrow{top:calc((0.5rem + 1px) * -1)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^="bottom"]>.arrow::before{top:0;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^="bottom"]>.arrow::after{top:1px;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:0.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^="left"]>.arrow{right:calc((0.5rem + 1px) * -1);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^="left"]>.arrow::before{right:0;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^="left"]>.arrow::after{right:1px;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:#fff}.popover-header{padding:0.5rem 0.75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:0.5rem 0.75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform 0.6s ease-in-out;transition:-webkit-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;-webkit-transition:0s 0.6s opacity;transition:0s 0.6s opacity}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{-webkit-transition:none;transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:0.5;-webkit-transition:opacity 0.15s ease;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{-webkit-transition:none;transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:0.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50% / 100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-webkit-box-flex:0;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;-webkit-transition:opacity 0.6s ease;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators li{-webkit-transition:none;transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:0.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:0.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#007bff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#0062cc !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#28a745 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#bd2130 !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#007bff !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:0.2rem !important}.rounded{border-radius:0.25rem !important}.rounded-top{border-top-left-radius:0.25rem !important;border-top-right-radius:0.25rem !important}.rounded-right{border-top-right-radius:0.25rem !important;border-bottom-right-radius:0.25rem !important}.rounded-bottom{border-bottom-right-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-left{border-top-left-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-lg{border-radius:0.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-webkit-box !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-webkit-box !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-webkit-box !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-webkit-box !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-webkit-box !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:-webkit-box !important;display:flex !important}.d-print-inline-flex{display:-webkit-inline-box !important;display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;flex-direction:row !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;flex-direction:column !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{-webkit-box-flex:1 !important;flex:1 1 auto !important}.flex-grow-0{-webkit-box-flex:0 !important;flex-grow:0 !important}.flex-grow-1{-webkit-box-flex:1 !important;flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.justify-content-start{-webkit-box-pack:start !important;justify-content:flex-start !important}.justify-content-end{-webkit-box-pack:end !important;justify-content:flex-end !important}.justify-content-center{-webkit-box-pack:center !important;justify-content:center !important}.justify-content-between{-webkit-box-pack:justify !important;justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{-webkit-box-align:start !important;align-items:flex-start !important}.align-items-end{-webkit-box-align:end !important;align-items:flex-end !important}.align-items-center{-webkit-box-align:center !important;align-items:center !important}.align-items-baseline{-webkit-box-align:baseline !important;align-items:baseline !important}.align-items-stretch{-webkit-box-align:stretch !important;align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;flex-direction:row !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;flex-direction:column !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{-webkit-box-flex:1 !important;flex:1 1 auto !important}.flex-sm-grow-0{-webkit-box-flex:0 !important;flex-grow:0 !important}.flex-sm-grow-1{-webkit-box-flex:1 !important;flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.justify-content-sm-start{-webkit-box-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-webkit-box-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-webkit-box-pack:center !important;justify-content:center !important}.justify-content-sm-between{-webkit-box-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{-webkit-box-align:start !important;align-items:flex-start !important}.align-items-sm-end{-webkit-box-align:end !important;align-items:flex-end !important}.align-items-sm-center{-webkit-box-align:center !important;align-items:center !important}.align-items-sm-baseline{-webkit-box-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-webkit-box-align:stretch !important;align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;flex-direction:row !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;flex-direction:column !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{-webkit-box-flex:1 !important;flex:1 1 auto !important}.flex-md-grow-0{-webkit-box-flex:0 !important;flex-grow:0 !important}.flex-md-grow-1{-webkit-box-flex:1 !important;flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.justify-content-md-start{-webkit-box-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-webkit-box-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-webkit-box-pack:center !important;justify-content:center !important}.justify-content-md-between{-webkit-box-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{-webkit-box-align:start !important;align-items:flex-start !important}.align-items-md-end{-webkit-box-align:end !important;align-items:flex-end !important}.align-items-md-center{-webkit-box-align:center !important;align-items:center !important}.align-items-md-baseline{-webkit-box-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-webkit-box-align:stretch !important;align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;flex-direction:row !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;flex-direction:column !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{-webkit-box-flex:1 !important;flex:1 1 auto !important}.flex-lg-grow-0{-webkit-box-flex:0 !important;flex-grow:0 !important}.flex-lg-grow-1{-webkit-box-flex:1 !important;flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.justify-content-lg-start{-webkit-box-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-webkit-box-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-webkit-box-pack:center !important;justify-content:center !important}.justify-content-lg-between{-webkit-box-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{-webkit-box-align:start !important;align-items:flex-start !important}.align-items-lg-end{-webkit-box-align:end !important;align-items:flex-end !important}.align-items-lg-center{-webkit-box-align:center !important;align-items:center !important}.align-items-lg-baseline{-webkit-box-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-webkit-box-align:stretch !important;align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;flex-direction:row !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;flex-direction:column !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{-webkit-box-flex:1 !important;flex:1 1 auto !important}.flex-xl-grow-0{-webkit-box-flex:0 !important;flex-grow:0 !important}.flex-xl-grow-1{-webkit-box-flex:1 !important;flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.justify-content-xl-start{-webkit-box-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-webkit-box-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-webkit-box-pack:center !important;justify-content:center !important}.justify-content-xl-between{-webkit-box-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{-webkit-box-align:start !important;align-items:flex-start !important}.align-items-xl-end{-webkit-box-align:end !important;align-items:flex-end !important}.align-items-xl-center{-webkit-box-align:center !important;align-items:center !important}.align-items-xl-baseline{-webkit-box-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-webkit-box-align:stretch !important;align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:-webkit-sticky !important;position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: -webkit-sticky) or (position: sticky){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:0.25rem !important}.mt-1,.my-1{margin-top:0.25rem !important}.mr-1,.mx-1{margin-right:0.25rem !important}.mb-1,.my-1{margin-bottom:0.25rem !important}.ml-1,.mx-1{margin-left:0.25rem !important}.m-2{margin:0.5rem !important}.mt-2,.my-2{margin-top:0.5rem !important}.mr-2,.mx-2{margin-right:0.5rem !important}.mb-2,.my-2{margin-bottom:0.5rem !important}.ml-2,.mx-2{margin-left:0.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:0.25rem !important}.pt-1,.py-1{padding-top:0.25rem !important}.pr-1,.px-1{padding-right:0.25rem !important}.pb-1,.py-1{padding-bottom:0.25rem !important}.pl-1,.px-1{padding-left:0.25rem !important}.p-2{padding:0.5rem !important}.pt-2,.py-2{padding-top:0.5rem !important}.pr-2,.px-2{padding-right:0.5rem !important}.pb-2,.py-2{padding-bottom:0.5rem !important}.pl-2,.px-2{padding-left:0.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:0.25rem !important}.mt-sm-1,.my-sm-1{margin-top:0.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:0.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:0.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:0.25rem !important}.m-sm-2{margin:0.5rem !important}.mt-sm-2,.my-sm-2{margin-top:0.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:0.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:0.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:0.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:0.25rem !important}.pt-sm-1,.py-sm-1{padding-top:0.25rem !important}.pr-sm-1,.px-sm-1{padding-right:0.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:0.25rem !important}.pl-sm-1,.px-sm-1{padding-left:0.25rem !important}.p-sm-2{padding:0.5rem !important}.pt-sm-2,.py-sm-2{padding-top:0.5rem !important}.pr-sm-2,.px-sm-2{padding-right:0.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:0.5rem !important}.pl-sm-2,.px-sm-2{padding-left:0.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:0.25rem !important}.mt-md-1,.my-md-1{margin-top:0.25rem !important}.mr-md-1,.mx-md-1{margin-right:0.25rem !important}.mb-md-1,.my-md-1{margin-bottom:0.25rem !important}.ml-md-1,.mx-md-1{margin-left:0.25rem !important}.m-md-2{margin:0.5rem !important}.mt-md-2,.my-md-2{margin-top:0.5rem !important}.mr-md-2,.mx-md-2{margin-right:0.5rem !important}.mb-md-2,.my-md-2{margin-bottom:0.5rem !important}.ml-md-2,.mx-md-2{margin-left:0.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:0.25rem !important}.pt-md-1,.py-md-1{padding-top:0.25rem !important}.pr-md-1,.px-md-1{padding-right:0.25rem !important}.pb-md-1,.py-md-1{padding-bottom:0.25rem !important}.pl-md-1,.px-md-1{padding-left:0.25rem !important}.p-md-2{padding:0.5rem !important}.pt-md-2,.py-md-2{padding-top:0.5rem !important}.pr-md-2,.px-md-2{padding-right:0.5rem !important}.pb-md-2,.py-md-2{padding-bottom:0.5rem !important}.pl-md-2,.px-md-2{padding-left:0.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:0.25rem !important}.mt-lg-1,.my-lg-1{margin-top:0.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:0.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:0.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:0.25rem !important}.m-lg-2{margin:0.5rem !important}.mt-lg-2,.my-lg-2{margin-top:0.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:0.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:0.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:0.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:0.25rem !important}.pt-lg-1,.py-lg-1{padding-top:0.25rem !important}.pr-lg-1,.px-lg-1{padding-right:0.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:0.25rem !important}.pl-lg-1,.px-lg-1{padding-left:0.25rem !important}.p-lg-2{padding:0.5rem !important}.pt-lg-2,.py-lg-2{padding-top:0.5rem !important}.pr-lg-2,.px-lg-2{padding-right:0.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:0.5rem !important}.pl-lg-2,.px-lg-2{padding-left:0.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:0.25rem !important}.mt-xl-1,.my-xl-1{margin-top:0.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:0.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:0.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:0.25rem !important}.m-xl-2{margin:0.5rem !important}.mt-xl-2,.my-xl-2{margin-top:0.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:0.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:0.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:0.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:0.25rem !important}.pt-xl-1,.py-xl-1{padding-top:0.25rem !important}.pr-xl-1,.px-xl-1{padding-right:0.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:0.25rem !important}.pl-xl-1,.px-xl-1{padding-left:0.25rem !important}.p-xl-2{padding:0.5rem !important}.pt-xl-2,.py-xl-2{padding-top:0.5rem !important}.pr-xl-2,.px-xl-2{padding-right:0.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:0.5rem !important}.pl-xl-2,.px-xl-2{padding-left:0.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-monospace{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#007bff !important}a.text-primary:hover,a.text-primary:focus{color:#0056b3 !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#494f54 !important}.text-success{color:#28a745 !important}a.text-success:hover,a.text-success:focus{color:#19692c !important}.text-info{color:#17a2b8 !important}a.text-info:hover,a.text-info:focus{color:#0f6674 !important}.text-warning{color:#ffc107 !important}a.text-warning:hover,a.text-warning:focus{color:#ba8b00 !important}.text-danger{color:#dc3545 !important}a.text-danger:hover,a.text-danger:focus{color:#a71d2a !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#cbd3da !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#121416 !important}.text-body{color:#212529 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;overflow-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url("/assets/font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot?v=4.7.0");src:url("/assets/font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot?v=4.7.0#iefix") format("embedded-opentype"),url("/assets/font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2?v=4.7.0") format("woff2"),url("/assets/font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff?v=4.7.0") format("woff"),url("/assets/font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf?v=4.7.0") format("truetype"),url("/assets/font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:0.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(50%, #fff), to(#eee));background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(50%, #eee), to(#ccc));background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), color-stop(50%, #eee));background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(50%, #eee), to(#fff));background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--bootstrap4 .select2-selection--single{height:calc(1.5em + .75rem + 2px) !important}.select2-container--bootstrap4 .select2-selection--single .select2-selection__placeholder{color:#757575;line-height:calc(1.5em + .75rem)}.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow{position:absolute;top:50%;right:3px;width:20px}.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b{top:60%;border-color:#343a40 transparent transparent;border-style:solid;border-width:5px 4px 0;width:0;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute}.select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered{line-height:calc(1.5em + .75rem)}.select2-search--dropdown .select2-search__field{border:1px solid #ced4da;border-radius:.25rem}.select2-results__message{color:#6c757d}.select2-container--bootstrap4 .select2-selection--multiple{min-height:calc(1.5em + .75rem + 2px) !important}.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice{color:#343a40;border:1px solid #bdc6d0;border-radius:.2rem;padding:0 5px 0 0;cursor:pointer;float:left;margin-top:.3em;margin-right:5px}.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove{color:#bdc6d0;font-weight:700;margin-left:3px;margin-right:1px;padding-right:3px;padding-left:3px;float:left}.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove:hover{color:#343a40}.select2-container{display:block}.select2-container :focus{outline:0}.input-group .select2-container--bootstrap4{-webkit-box-flex:1;flex-grow:1}.input-group-prepend ~ .select2-container--bootstrap4 .select2-selection{border-top-left-radius:0;border-bottom-left-radius:0}.select2-container--bootstrap4 .select2-selection{border:1px solid #ced4da;border-radius:.25rem;width:100%}.select2-container--bootstrap4.select2-container--focus .select2-selection{border-color:#17a2b8;box-shadow:0 0 0 0.2rem rgba(0,123,255,0.25)}.select2-container--bootstrap4.select2-container--focus.select2-container--open .select2-selection{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--bootstrap4.select2-container--disabled.select2-container--focus .select2-selection,.select2-container--bootstrap4.select2-container--disabled .select2-selection{background-color:#e9ecef;cursor:not-allowed;border-color:#ced4da;box-shadow:none}.select2-container--bootstrap4.select2-container--disabled.select2-container--focus .select2-search__field,.select2-container--bootstrap4.select2-container--disabled .select2-search__field{background-color:transparent}form.was-validated select:invalid ~ .select2-container--bootstrap4 .select2-selection,select.is-invalid ~ .select2-container--bootstrap4 .select2-selection{border-color:#dc3545}form.was-validated select:valid ~ .select2-container--bootstrap4 .select2-selection,select.is-valid ~ .select2-container--bootstrap4 .select2-selection{border-color:#28a745}.select2-container--bootstrap4 .select2-dropdown{border-color:#ced4da;border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--bootstrap4 .select2-dropdown.select2-dropdown--above{border-top:1px solid #ced4da;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.select2-container--bootstrap4 .select2-dropdown .select2-results__option[aria-selected=true]{background-color:#e9ecef}.select2-container--bootstrap4 .select2-results__option--highlighted,.select2-container--bootstrap4 .select2-results__option--highlighted.select2-results__option[aria-selected=true]{background-color:#007bff;color:#f8f9fa}.select2-container--bootstrap4 .select2-results__option[role=group]{padding:0}.select2-container--bootstrap4 .select2-results>.select2-results__options{max-height:15em;overflow-y:auto}.select2-container--bootstrap4 .select2-results__group{padding:6px;display:list-item;color:#6c757d}.select2-container--bootstrap4 .select2-selection__clear{width:1.2em;height:1.2em;line-height:1.15em;padding-left:.3em;margin-top:.5em;border-radius:100%;background-color:#ccc;color:#f8f9fa;float:right;margin-right:.3em}.select2-container--bootstrap4 .select2-selection__clear:hover{background-color:#343a40}/*! + * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */.datepicker{padding:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl.dropdown-menu{left:auto}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #999;border-top:0;border-bottom-color:rgba(0,0,0,0.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day:hover,.datepicker table tr td.day.focused{background:#eee;cursor:pointer}.datepicker table tr td.old,.datepicker table tr td.new{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:none;color:#999;cursor:default}.datepicker table tr td.highlighted{background:#d9edf7;border-radius:0}.datepicker table tr td.today,.datepicker table tr td.today:hover,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-webkit-gradient(linear, left top, left bottom, from(#fdd49a), to(#fdf59a));background-image:linear-gradient(to bottom, #fdd49a, #fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today:hover,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today[disabled],.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active{background-color:#fbf069 \9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range:hover,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover{background:#eee;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover{background-color:#f3d17a;background-image:-webkit-gradient(linear, left top, left bottom, from(#f3c17a), to(#f3e97a));background-image:linear-gradient(to bottom, #f3c17a, #f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:0}.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled:hover[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active{background-color:#efe24b \9}.datepicker table tr td.selected,.datepicker table tr td.selected:hover,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover{background-color:#9e9e9e;background-image:-webkit-gradient(linear, left top, left bottom, from(#b3b3b3), to(gray));background-image:linear-gradient(to bottom, #b3b3b3, gray);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:#808080 #808080 #595959;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled:hover[disabled]{background-color:#808080}.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active{background-color:#666666 \9}.datepicker table tr td.active,.datepicker table tr td.active:hover,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-webkit-gradient(linear, left top, left bottom, from(#08c), to(#04c));background-image:linear-gradient(to bottom, #08c, #04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.active:hover,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active[disabled],.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span:hover,.datepicker table tr td span.focused{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:none;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-webkit-gradient(linear, left top, left bottom, from(#08c), to(#04c));background-image:linear-gradient(to bottom, #08c, #04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span.old,.datepicker table tr td span.new{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch,.datepicker .prev,.datepicker .next,.datepicker tfoot tr th{cursor:pointer}.datepicker .datepicker-switch:hover,.datepicker .prev:hover,.datepicker .next:hover,.datepicker tfoot tr th:hover{background:#eee}.datepicker .prev.disabled,.datepicker .next.disabled{visibility:hidden}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-append.date .add-on,.input-prepend.date .add-on{cursor:pointer}.input-append.date .add-on i,.input-prepend.date .add-on i{margin-top:3px}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}/*! + * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */.datepicker{padding:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl.dropdown-menu{left:auto}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #999;border-top:0;border-bottom-color:rgba(0,0,0,0.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day:hover,.datepicker table tr td.day.focused{background:#eee;cursor:pointer}.datepicker table tr td.old,.datepicker table tr td.new{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:none;color:#999;cursor:default}.datepicker table tr td.highlighted{background:#d9edf7;border-radius:0}.datepicker table tr td.today,.datepicker table tr td.today:hover,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-webkit-gradient(linear, left top, left bottom, from(#fdd49a), to(#fdf59a));background-image:linear-gradient(to bottom, #fdd49a, #fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today:hover,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today[disabled],.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active{background-color:#fbf069 \9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range:hover,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover{background:#eee;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover{background-color:#f3d17a;background-image:-webkit-gradient(linear, left top, left bottom, from(#f3c17a), to(#f3e97a));background-image:linear-gradient(to bottom, #f3c17a, #f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:0}.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled:hover[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active{background-color:#efe24b \9}.datepicker table tr td.selected,.datepicker table tr td.selected:hover,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover{background-color:#9e9e9e;background-image:-webkit-gradient(linear, left top, left bottom, from(#b3b3b3), to(gray));background-image:linear-gradient(to bottom, #b3b3b3, gray);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:#808080 #808080 #595959;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled:hover[disabled]{background-color:#808080}.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active{background-color:#666666 \9}.datepicker table tr td.active,.datepicker table tr td.active:hover,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-webkit-gradient(linear, left top, left bottom, from(#08c), to(#04c));background-image:linear-gradient(to bottom, #08c, #04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.active:hover,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active[disabled],.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span:hover,.datepicker table tr td span.focused{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:none;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-webkit-gradient(linear, left top, left bottom, from(#08c), to(#04c));background-image:linear-gradient(to bottom, #08c, #04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span.old,.datepicker table tr td span.new{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch,.datepicker .prev,.datepicker .next,.datepicker tfoot tr th{cursor:pointer}.datepicker .datepicker-switch:hover,.datepicker .prev:hover,.datepicker .next:hover,.datepicker tfoot tr th:hover{background:#eee}.datepicker .prev.disabled,.datepicker .next.disabled{visibility:hidden}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-append.date .add-on,.input-prepend.date .add-on{cursor:pointer}.input-append.date .add-on i,.input-prepend.date .add-on i{margin-top:3px}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:20px;padding:4px 5px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}.datepicker.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:5px;box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;color:#333333;font-size:13px;line-height:20px}.datepicker.dropdown-menu th,.datepicker.datepicker-inline th,.datepicker.dropdown-menu td,.datepicker.datepicker-inline td{padding:4px 5px}.mloading-container{position:relative;min-height:70px;-webkit-transition:height 0.6s ease-in-out;transition:height 0.6s ease-in-out}.mloading{position:absolute;background:#E9E9E8;font:normal 12px/22px "Microsoft Yahei", "微软雅黑", "宋体";display:none;z-index:1600;background:rgba(233,233,232,0)}.mloading.active{display:block}.mloading.mloading-mask{background:rgba(233,233,232,0.75);filter:progid:DXImageTransform.Microsoft.Alpha(opacity=75)}.mloading-full{position:fixed;width:100%;height:100%;top:0;left:0}.mloading-container>.mloading{top:0px;left:0px;width:100%;height:100%}.mloading-body{width:100%;height:100%;position:relative}.mloading-bar{width:250px;min-height:22px;text-align:center;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,0.27);border-radius:7px;padding:20px 15px;font-size:14px;color:#999;position:absolute;top:50%;left:50%;margin-left:-140px;margin-top:-30px;word-break:break-all}@media (max-width: 300px){.mloading-bar{width:62px;height:56px;margin-left:-30px !important;margin-top:-30px !important;padding:0;line-height:56px}.mloading-bar>.mloading-text{display:none}}.mloading-bar-sm{width:62px;height:56px;margin-left:-30px !important;margin-top:-30px !important;padding:0;line-height:56px}.mloading-bar-sm>.mloading-text{display:none}.mloading-icon{width:16px;height:16px;vertical-align:middle}.mloading-text{margin-left:10px}/*! + * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/) + * Author: boniface pereira + * Website: www.craftpip.com + * Contact: hey@craftpip.com + * + * Copyright 2013-2019 jquery-confirm + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */@-webkit-keyframes jconfirm-spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes jconfirm-spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}body[class*=jconfirm-no-scroll-]{overflow:hidden !important}.jconfirm{position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999999;font-family:inherit;overflow:hidden}.jconfirm .jconfirm-bg{position:fixed;top:0;left:0;right:0;bottom:0;-webkit-transition:opacity .4s;transition:opacity .4s}.jconfirm .jconfirm-bg.jconfirm-bg-h{opacity:0 !important}.jconfirm .jconfirm-scrollpane{-webkit-perspective:500px;perspective:500px;-webkit-perspective-origin:center;perspective-origin:center;display:table;width:100%;height:100%}.jconfirm .jconfirm-row{display:table-row;width:100%}.jconfirm .jconfirm-cell{display:table-cell;vertical-align:middle}.jconfirm .jconfirm-holder{max-height:100%;padding:50px 0}.jconfirm .jconfirm-box-container{-webkit-transition:-webkit-transform;transition:-webkit-transform;transition:transform;transition:transform, -webkit-transform;transition:transform,-webkit-transform}.jconfirm .jconfirm-box-container.jconfirm-no-transition{-webkit-transition:none !important;transition:none !important}.jconfirm .jconfirm-box{background:white;border-radius:4px;position:relative;outline:0;padding:15px 15px 0;overflow:hidden;margin-left:auto;margin-right:auto}@-webkit-keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@-webkit-keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@-webkit-keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@-webkit-keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@-webkit-keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@-webkit-keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}@keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}.jconfirm .jconfirm-box.jconfirm-type-animated{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.jconfirm .jconfirm-box.jconfirm-type-blue{border-top:solid 7px #3498db;-webkit-animation-name:type-blue;animation-name:type-blue}.jconfirm .jconfirm-box.jconfirm-type-green{border-top:solid 7px #2ecc71;-webkit-animation-name:type-green;animation-name:type-green}.jconfirm .jconfirm-box.jconfirm-type-red{border-top:solid 7px #e74c3c;-webkit-animation-name:type-red;animation-name:type-red}.jconfirm .jconfirm-box.jconfirm-type-orange{border-top:solid 7px #f1c40f;-webkit-animation-name:type-orange;animation-name:type-orange}.jconfirm .jconfirm-box.jconfirm-type-purple{border-top:solid 7px #9b59b6;-webkit-animation-name:type-purple;animation-name:type-purple}.jconfirm .jconfirm-box.jconfirm-type-dark{border-top:solid 7px #34495e;-webkit-animation-name:type-dark;animation-name:type-dark}.jconfirm .jconfirm-box.loading{height:120px}.jconfirm .jconfirm-box.loading:before{content:'';position:absolute;left:0;background:white;right:0;top:0;bottom:0;border-radius:10px;z-index:1}.jconfirm .jconfirm-box.loading:after{opacity:.6;content:'';height:30px;width:30px;border:solid 3px transparent;position:absolute;left:50%;margin-left:-15px;border-radius:50%;-webkit-animation:jconfirm-spin 1s infinite linear;animation:jconfirm-spin 1s infinite linear;border-bottom-color:dodgerblue;top:50%;margin-top:-15px;z-index:2}.jconfirm .jconfirm-box div.jconfirm-closeIcon{height:20px;width:20px;position:absolute;top:10px;right:10px;cursor:pointer;opacity:.6;text-align:center;font-size:27px !important;line-height:14px !important;display:none;z-index:1}.jconfirm .jconfirm-box div.jconfirm-closeIcon:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-closeIcon .fa{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .glyphicon{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .zmdi{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover{opacity:1}.jconfirm .jconfirm-box div.jconfirm-title-c{display:block;font-size:22px;line-height:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;padding-bottom:15px}.jconfirm .jconfirm-box div.jconfirm-title-c.jconfirm-hand{cursor:move}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{font-size:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i{vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:inherit;font-family:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-content-pane{margin-bottom:15px;height:auto;-webkit-transition:height .4s ease-in;transition:height .4s ease-in;display:inline-block;width:100%;position:relative;overflow-x:hidden;overflow-y:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane.no-scroll{overflow-y:hidden}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar{width:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-track{background:rgba(0,0,0,0.1)}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-thumb{background:#666;border-radius:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content{overflow:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content img{max-width:100%;height:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content:empty{display:none}.jconfirm .jconfirm-box .jconfirm-buttons{padding-bottom:11px}.jconfirm .jconfirm-box .jconfirm-buttons>button{margin-bottom:4px;margin-left:2px;margin-right:2px}.jconfirm .jconfirm-box .jconfirm-buttons button{display:inline-block;padding:6px 12px;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;min-height:1em;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;-webkit-tap-highlight-color:transparent;border:0;background-image:none}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue{background-color:#3498db;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue:hover{background-color:#2980b9;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green{background-color:#2ecc71;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green:hover{background-color:#27ae60;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red{background-color:#e74c3c;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red:hover{background-color:#c0392b;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange{background-color:#f1c40f;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange:hover{background-color:#f39c12;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default{background-color:#ecf0f1;color:#000;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default:hover{background-color:#bdc3c7;color:#000}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple{background-color:#9b59b6;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple:hover{background-color:#8e44ad;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark{background-color:#34495e;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark:hover{background-color:#2c3e50;color:#FFF}.jconfirm .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c{color:#e74c3c !important}.jconfirm .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c{color:#3498db !important}.jconfirm .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c{color:#2ecc71 !important}.jconfirm .jconfirm-box.jconfirm-type-purple .jconfirm-title-c .jconfirm-icon-c{color:#9b59b6 !important}.jconfirm .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c{color:#f1c40f !important}.jconfirm .jconfirm-box.jconfirm-type-dark .jconfirm-title-c .jconfirm-icon-c{color:#34495e !important}.jconfirm .jconfirm-clear{clear:both}.jconfirm.jconfirm-rtl{direction:rtl}.jconfirm.jconfirm-rtl div.jconfirm-closeIcon{left:5px;right:auto}.jconfirm.jconfirm-white .jconfirm-bg,.jconfirm.jconfirm-light .jconfirm-bg{background-color:#444;opacity:.2}.jconfirm.jconfirm-white .jconfirm-box,.jconfirm.jconfirm-light .jconfirm-box{box-shadow:0 2px 6px rgba(0,0,0,0.2);border-radius:5px}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default{box-shadow:none;color:#333}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#ddd}.jconfirm.jconfirm-white.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-black .jconfirm-bg,.jconfirm.jconfirm-dark .jconfirm-bg{background-color:darkslategray;opacity:.4}.jconfirm.jconfirm-black .jconfirm-box,.jconfirm.jconfirm-dark .jconfirm-box{box-shadow:0 2px 6px rgba(0,0,0,0.2);background:#444;border-radius:5px;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button{border:0;background-image:none;text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none;-webkit-transition:background .1s;transition:background .1s;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default{box-shadow:none;color:#fff;background:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#666}.jconfirm.jconfirm-black.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-shake{-webkit-animation:shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;animation:shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-glow{-webkit-animation:glow 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;animation:glow 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-2px, 0, 0);transform:translate3d(-2px, 0, 0)}20%,80%{-webkit-transform:translate3d(4px, 0, 0);transform:translate3d(4px, 0, 0)}30%,50%,70%{-webkit-transform:translate3d(-8px, 0, 0);transform:translate3d(-8px, 0, 0)}40%,60%{-webkit-transform:translate3d(8px, 0, 0);transform:translate3d(8px, 0, 0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-2px, 0, 0);transform:translate3d(-2px, 0, 0)}20%,80%{-webkit-transform:translate3d(4px, 0, 0);transform:translate3d(4px, 0, 0)}30%,50%,70%{-webkit-transform:translate3d(-8px, 0, 0);transform:translate3d(-8px, 0, 0)}40%,60%{-webkit-transform:translate3d(8px, 0, 0);transform:translate3d(8px, 0, 0)}}@-webkit-keyframes glow{0%,100%{box-shadow:0 0 0 red}50%{box-shadow:0 0 30px red}}@keyframes glow{0%,100%{box-shadow:0 0 0 red}50%{box-shadow:0 0 30px red}}.jconfirm{-webkit-perspective:400px;perspective:400px}.jconfirm .jconfirm-box{opacity:1;-webkit-transition-property:all;transition-property:all}.jconfirm .jconfirm-box.jconfirm-animation-top,.jconfirm .jconfirm-box.jconfirm-animation-left,.jconfirm .jconfirm-box.jconfirm-animation-right,.jconfirm .jconfirm-box.jconfirm-animation-bottom,.jconfirm .jconfirm-box.jconfirm-animation-opacity,.jconfirm .jconfirm-box.jconfirm-animation-zoom,.jconfirm .jconfirm-box.jconfirm-animation-scale,.jconfirm .jconfirm-box.jconfirm-animation-none,.jconfirm .jconfirm-box.jconfirm-animation-rotate,.jconfirm .jconfirm-box.jconfirm-animation-rotatex,.jconfirm .jconfirm-box.jconfirm-animation-rotatey,.jconfirm .jconfirm-box.jconfirm-animation-scaley,.jconfirm .jconfirm-box.jconfirm-animation-scalex{opacity:0}.jconfirm .jconfirm-box.jconfirm-animation-rotate{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.jconfirm .jconfirm-box.jconfirm-animation-rotatex{-webkit-transform:rotateX(90deg);transform:rotateX(90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatexr{-webkit-transform:rotateX(-90deg);transform:rotateX(-90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatey{-webkit-transform:rotatey(90deg);transform:rotatey(90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotateyr{-webkit-transform:rotatey(-90deg);transform:rotatey(-90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scaley{-webkit-transform:scaley(1.5);transform:scaley(1.5);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scalex{-webkit-transform:scalex(1.5);transform:scalex(1.5);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-top{-webkit-transform:translate(0px, -100px);transform:translate(0px, -100px)}.jconfirm .jconfirm-box.jconfirm-animation-left{-webkit-transform:translate(-100px, 0px);transform:translate(-100px, 0px)}.jconfirm .jconfirm-box.jconfirm-animation-right{-webkit-transform:translate(100px, 0px);transform:translate(100px, 0px)}.jconfirm .jconfirm-box.jconfirm-animation-bottom{-webkit-transform:translate(0px, 100px);transform:translate(0px, 100px)}.jconfirm .jconfirm-box.jconfirm-animation-zoom{-webkit-transform:scale(1.2);transform:scale(1.2)}.jconfirm .jconfirm-box.jconfirm-animation-scale{-webkit-transform:scale(0.5);transform:scale(0.5)}.jconfirm .jconfirm-box.jconfirm-animation-none{visibility:hidden}.jconfirm.jconfirm-supervan .jconfirm-bg{background-color:rgba(54,70,93,0.95)}.jconfirm.jconfirm-supervan .jconfirm-box{background-color:transparent}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-blue{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-green{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-red{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-orange{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-purple{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-dark{border:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-closeIcon{color:white}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c{text-align:center;color:white;font-size:28px;font-weight:normal}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c>*{padding-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content-pane{margin-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content{text-align:center;color:white}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons button{font-size:16px;border-radius:2px;background:#303f53;text-shadow:none;border:0;color:white;padding:10px;min-width:100px}.jconfirm.jconfirm-supervan.jconfirm-rtl .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-material .jconfirm-bg{background-color:rgba(0,0,0,0.67)}.jconfirm.jconfirm-material .jconfirm-box{background-color:white;box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 25px 10px 25px}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons{text-align:right}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-weight:500}.jconfirm.jconfirm-material.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-bootstrap .jconfirm-bg{background-color:rgba(0,0,0,0.21)}.jconfirm.jconfirm-bootstrap .jconfirm-box{background-color:white;box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);border:solid 1px rgba(0,0,0,0.4);padding:15px 0 0}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold;padding-left:15px;padding-right:15px}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87);padding:0 15px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons{text-align:right;padding:10px;margin:-5px 0 0;border-top:solid 1px #ddd;overflow:hidden;border-radius:0 0 4px 4px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons button{font-weight:500}.jconfirm.jconfirm-bootstrap.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-modern .jconfirm-bg{background-color:slategray;opacity:.6}.jconfirm.jconfirm-modern .jconfirm-box{background-color:white;box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 30px 15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87);top:15px;right:15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:24px;font-weight:bold;text-align:center;margin-bottom:10px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{-webkit-transition:-webkit-transform .5s;transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s, -webkit-transform .5s;transition:transform .5s,-webkit-transform .5s;-webkit-transform:scale(0);transform:scale(0);display:block;margin-right:0;margin-left:0;margin-bottom:10px;font-size:69px;color:#aaa}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-content{text-align:center;font-size:15px;color:#777;margin-bottom:25px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button{font-weight:bold;text-transform:uppercase;-webkit-transition:background .1s;transition:background .1s;padding:10px 20px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button+button{margin-left:4px}.jconfirm.jconfirm-modern.jconfirm-open .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{-webkit-transform:scale(1);transform:scale(1)}/*! + * Datetimepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */.datetimepicker{padding:4px;margin-top:1px;border-radius:4px;direction:ltr}.datetimepicker-inline{width:220px}.datetimepicker.datetimepicker-rtl{direction:rtl}.datetimepicker.datetimepicker-rtl table tr td span{float:right}.datetimepicker-dropdown,.datetimepicker-dropdown-left{top:0;left:0}[class*=" datetimepicker-dropdown"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute}[class*=" datetimepicker-dropdown"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute}[class*=" datetimepicker-dropdown-top"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0}[class*=" datetimepicker-dropdown-top"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;border-bottom:0}.datetimepicker-dropdown-bottom-left:before{top:-7px;right:6px}.datetimepicker-dropdown-bottom-left:after{top:-6px;right:7px}.datetimepicker-dropdown-bottom-right:before{top:-7px;left:6px}.datetimepicker-dropdown-bottom-right:after{top:-6px;left:7px}.datetimepicker-dropdown-top-left:before{bottom:-7px;right:6px}.datetimepicker-dropdown-top-left:after{bottom:-6px;right:7px}.datetimepicker-dropdown-top-right:before{bottom:-7px;left:6px}.datetimepicker-dropdown-top-right:after{bottom:-6px;left:7px}.datetimepicker>div{display:none}.datetimepicker.minutes div.datetimepicker-minutes{display:block}.datetimepicker.hours div.datetimepicker-hours{display:block}.datetimepicker.days div.datetimepicker-days{display:block}.datetimepicker.months div.datetimepicker-months{display:block}.datetimepicker.years div.datetimepicker-years{display:block}.datetimepicker table{margin:0}.datetimepicker td,.datetimepicker th{text-align:center;width:20px;height:20px;border-radius:4px;border:0}.table-striped .datetimepicker table tr td,.table-striped .datetimepicker table tr th{background-color:transparent}.datetimepicker table tr td.minute:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.hour:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.day:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.old,.datetimepicker table tr td.new{color:#999}.datetimepicker table tr td.disabled,.datetimepicker table tr td.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td.today,.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-webkit-gradient(linear, left top, left bottom, from(#fdd49a), to(#fdf59a));background-image:linear-gradient(to bottom, #fdd49a, #fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a',endColorstr='#fdf59a',GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today:hover:hover,.datetimepicker table tr td.today.disabled:hover,.datetimepicker table tr td.today.disabled:hover:hover,.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today:hover.disabled,.datetimepicker table tr td.today.disabled.disabled,.datetimepicker table tr td.today.disabled:hover.disabled,.datetimepicker table tr td.today[disabled],.datetimepicker table tr td.today:hover[disabled],.datetimepicker table tr td.today.disabled[disabled],.datetimepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active{background-color:#fbf069}.datetimepicker table tr td.active,.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-webkit-gradient(linear, left top, left bottom, from(#08c), to(#04c));background-image:linear-gradient(to bottom, #08c, #04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active:hover:hover,.datetimepicker table tr td.active.disabled:hover,.datetimepicker table tr td.active.disabled:hover:hover,.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active:hover.disabled,.datetimepicker table tr td.active.disabled.disabled,.datetimepicker table tr td.active.disabled:hover.disabled,.datetimepicker table tr td.active[disabled],.datetimepicker table tr td.active:hover[disabled],.datetimepicker table tr td.active.disabled[disabled],.datetimepicker table tr td.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datetimepicker .datetimepicker-hours span{height:26px;line-height:26px}.datetimepicker .datetimepicker-hours table tr td span.hour_am,.datetimepicker .datetimepicker-hours table tr td span.hour_pm{width:14.6%}.datetimepicker .datetimepicker-hours fieldset legend,.datetimepicker .datetimepicker-minutes fieldset legend{margin-bottom:inherit;line-height:30px}.datetimepicker .datetimepicker-minutes span{height:26px;line-height:26px}.datetimepicker table tr td span:hover{background:#eee}.datetimepicker table tr td span.disabled,.datetimepicker table tr td span.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td span.active,.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-webkit-gradient(linear, left top, left bottom, from(#08c), to(#04c));background-image:linear-gradient(to bottom, #08c, #04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active:hover:hover,.datetimepicker table tr td span.active.disabled:hover,.datetimepicker table tr td span.active.disabled:hover:hover,.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active:hover.disabled,.datetimepicker table tr td span.active.disabled.disabled,.datetimepicker table tr td span.active.disabled:hover.disabled,.datetimepicker table tr td span.active[disabled],.datetimepicker table tr td span.active:hover[disabled],.datetimepicker table tr td span.active.disabled[disabled],.datetimepicker table tr td span.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span.old{color:#999}.datetimepicker th.switch{width:145px}.datetimepicker th span.glyphicon{pointer-events:none}.datetimepicker thead tr:first-child th,.datetimepicker tfoot th{cursor:pointer}.datetimepicker thead tr:first-child th:hover,.datetimepicker tfoot th:hover{background:#eee}.input-append.date .add-on i,.input-prepend.date .add-on i,.input-group.date .input-group-addon span{cursor:pointer;width:14px;height:14px}/*! ======================================================================== + * Bootstrap Toggle: bootstrap-toggle.css v2.2.0 + * http://www.bootstraptoggle.com + * ======================================================================== + * Copyright 2014 Min Hur, The New York Times Company + * Licensed under MIT + * ======================================================================== */.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px}.toggle{position:relative;overflow:hidden}.toggle input[type=checkbox]{display:none}.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none}.toggle.off .toggle-group{left:-100%}.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px}.toggle.btn{min-width:59px;min-height:34px}.toggle-on.btn{padding-right:24px}.toggle-off.btn{padding-left:24px}.toggle.btn-lg,.btn-group-lg>.toggle.btn{min-width:79px;min-height:45px}.toggle-on.btn-lg,.btn-group-lg>.toggle-on.btn{padding-right:31px}.toggle-off.btn-lg,.btn-group-lg>.toggle-off.btn{padding-left:31px}.toggle-handle.btn-lg,.btn-group-lg>.toggle-handle.btn{width:40px}.toggle.btn-sm,.btn-group-sm>.toggle.btn{min-width:50px;min-height:30px}.toggle-on.btn-sm,.btn-group-sm>.toggle-on.btn{padding-right:20px}.toggle-off.btn-sm,.btn-group-sm>.toggle-off.btn{padding-left:20px}.toggle.btn-xs{min-width:35px;min-height:22px}.toggle-on.btn-xs{padding-right:12px}.toggle-off.btn-xs{padding-left:12px}.CodeMirror{font-family:monospace;height:300px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0 !important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,0.5);-webkit-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-webkit-keyframes blink{0%{}50%{background-color:transparent}100%{}}@keyframes blink{0%{}50%{background-color:transparent}100%{}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:#f00}.cm-invalidchar{color:#f00}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,0.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll !important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none !important;border:none !important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:0.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,0.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none}/*! Editor.md v1.5.0 | editormd.min.css | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2015-06-09 *//*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */.fa-ul,.markdown-body .task-list-item,li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}.editormd-form br,.markdown-body hr:after{clear:both}.editormd{width:90%;height:640px;margin:0 auto 15px;text-align:left;overflow:hidden;position:relative;border:1px solid #ddd;font-family:"Meiryo UI","Microsoft YaHei","Malgun Gothic","Segoe UI","Trebuchet MS",Helvetica,Monaco,monospace,Tahoma,STXihei,"华文细黑",STHeiti,"Helvetica Neue","Droid Sans","wenquanyi micro hei",FreeSans,Arimo,Arial,SimSun,"宋体",Heiti,"黑体",sans-serif}.editormd *,.editormd :after,.editormd :before{box-sizing:border-box}.editormd a{text-decoration:none}.editormd img{border:none;vertical-align:middle}.editormd .editormd-html-textarea,.editormd .editormd-markdown-textarea,.editormd>textarea{width:0;height:0;outline:0;resize:none}.editormd .editormd-html-textarea,.editormd .editormd-markdown-textarea{display:none}.editormd button,.editormd input[type=text],.editormd input[type=button],.editormd input[type=submit],.editormd select,.editormd textarea{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none}.editormd ::-webkit-scrollbar{height:10px;width:7px;background:rgba(0,0,0,0.1)}.editormd ::-webkit-scrollbar:hover{background:rgba(0,0,0,0.2)}.editormd ::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.3);border-radius:6px}.editormd ::-webkit-scrollbar-thumb:hover{-ms-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.25);-o-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.25);box-shadow:inset 1px 1px 1px rgba(0,0,0,0.25);background-color:rgba(0,0,0,0.4)}.editormd-user-unselect{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.editormd-toolbar{width:100%;min-height:37px;background:#fff;display:none;position:absolute;top:0;left:0;z-index:10;border-bottom:1px solid #ddd}.editormd-toolbar-container{padding:0 8px;min-height:35px;-o-user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.editormd-toolbar-container,.markdown-body .octicon{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.editormd-menu,.markdown-body ol,.markdown-body td,.markdown-body th,.markdown-body ul{padding:0}.editormd-menu{margin:0;list-style:none}.editormd-menu>li{margin:0;padding:5px 1px;display:inline-block;position:relative}.editormd-menu>li.divider{display:inline-block;text-indent:-9999px;margin:0 5px;height:65%;border-right:1px solid #ddd}.editormd-menu>li>a{outline:0;color:#666;display:inline-block;min-width:24px;font-size:16px;text-decoration:none;text-align:center;border-radius:2px;border:1px solid #fff;-webkit-transition:all 300ms ease-out;transition:all 300ms ease-out}.editormd-dropdown-menu>li>a:hover,.editormd-menu>li>a{-webkit-transition:all 300ms ease-out;-moz-transition:all 300ms ease-out}.editormd-menu>li>a.active,.editormd-menu>li>a:hover{border:1px solid #ddd;background:#eee}.editormd-menu>li>a>.fa{text-align:center;display:block;padding:5px}.editormd-menu>li>a>.editormd-bold{padding:5px 2px;display:inline-block;font-weight:700}.editormd-menu>li:hover .editormd-dropdown-menu{display:block}.editormd-menu>li+li>a{margin-left:3px}.editormd-dropdown-menu{display:none;background:#fff;border:1px solid #ddd;width:148px;list-style:none;position:absolute;top:33px;left:0;z-index:100;-ms-box-shadow:1px 2px 6px rgba(0,0,0,0.15);-o-box-shadow:1px 2px 6px rgba(0,0,0,0.15);box-shadow:1px 2px 6px rgba(0,0,0,0.15)}.editormd-dropdown-menu:after,.editormd-dropdown-menu:before{width:0;height:0;display:block;content:"";position:absolute;top:-11px;left:8px;border:5px solid transparent}.editormd-dropdown-menu:before{border-bottom-color:#ccc}.editormd-dropdown-menu:after{border-bottom-color:#fff;top:-10px}.editormd-dropdown-menu>li>a{color:#666;display:block;text-decoration:none;padding:8px 10px}.editormd-dropdown-menu>li>a:hover{background:#f6f6f6;-webkit-transition:all 300ms ease-out;transition:all 300ms ease-out}.editormd-dropdown-menu>li+li{border-top:1px solid #ddd}.editormd-container{margin:0;width:100%;height:100%;overflow:hidden;padding:35px 0 0;position:relative;background:#fff;box-sizing:border-box}.editormd-dialog{color:#666;position:fixed;z-index:99999;display:none;border-radius:3px;-ms-box-shadow:0 0 10px rgba(0,0,0,0.3);-o-box-shadow:0 0 10px rgba(0,0,0,0.3);box-shadow:0 0 10px rgba(0,0,0,0.3);background:#fff;font-size:14px}.editormd-dialog-container{position:relative;padding:20px;line-height:1.4}.editormd-dialog-container h1{font-size:24px;margin-bottom:10px}.editormd-dialog-container h1 .fa{color:#2C7EEA;padding-right:5px}.editormd-dialog-container h1 small{padding-left:5px;font-weight:400;font-size:12px;color:#999}.editormd-dialog-container select{color:#999;padding:3px 8px;border:1px solid #ddd}.editormd-dialog-close{position:absolute;top:12px;right:15px;font-size:18px;color:#ccc;-webkit-transition:color 300ms ease-out;transition:color 300ms ease-out}.editormd-dialog-close:hover{color:#999}.editormd-dialog-header{padding:11px 20px;border-bottom:1px solid #eee;-webkit-transition:background 300ms ease-out;transition:background 300ms ease-out}.editormd-dialog-header:hover{background:#f6f6f6}.editormd-dialog-title{font-size:14px}.editormd-dialog-footer{padding:10px 0 0;text-align:right}.editormd-dialog-info{width:420px}.editormd-dialog-info h1{font-weight:400}.editormd-dialog-info .editormd-dialog-container{padding:20px 25px 25px}.editormd-dialog-info .editormd-dialog-close{top:10px;right:10px}.editormd-dialog-info .hover-link:hover,.editormd-dialog-info p>a{color:#2196F3}.editormd-dialog-info .hover-link{color:#666}.editormd-dialog-info a .fa-external-link{display:none}.editormd-dialog-info a:hover{color:#2196F3}.editormd-dialog-info a:hover .fa-external-link{display:inline-block}.editormd-container-mask,.editormd-dialog-mask,.editormd-mask{display:none;width:100%;height:100%;position:absolute;top:0;left:0}.editormd-dialog-mask-bg,.editormd-mask{background:#fff;opacity:.5;filter:alpha(opacity=50)}.editormd-mask{position:fixed;background:#000;opacity:.2;filter:alpha(opacity=20);z-index:99998}.editormd-container-mask,.editormd-dialog-mask-con{background:url(../images/loading.gif) center center no-repeat;background-size:32px 32px}.editormd-container-mask{z-index:20;display:block;background-color:#fff}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2){.editormd-container-mask,.editormd-dialog-mask-con{background-image:url(../images/loading@2x.gif)}}@media only screen and (-webkit-min-device-pixel-ratio: 3), only screen and (min-device-pixel-ratio: 3){.editormd-container-mask,.editormd-dialog-mask-con{background-image:url(../images/loading@3x.gif)}}.editormd-code-block-dialog textarea,.editormd-preformatted-text-dialog textarea{width:100%;height:400px;margin-bottom:6px;overflow:auto;border:1px solid #eee;background:#fff;padding:15px;resize:none}.editormd-code-toolbar{color:#999;font-size:14px;margin:-5px 0 10px}.editormd-grid-table{width:99%;display:table;border:1px solid #ddd;border-collapse:collapse}.editormd-grid-table-row{width:100%;display:table-row}.editormd-grid-table-row a{font-size:1.4em;width:5%;height:36px;color:#999;text-align:center;display:table-cell;vertical-align:middle;border:1px solid #ddd;text-decoration:none;-webkit-transition:background-color 300ms ease-out,color 100ms ease-in;transition:background-color 300ms ease-out,color 100ms ease-in}.editormd-grid-table-row a.selected{color:#666;background-color:#eee}.editormd-grid-table-row a:hover{color:#777;background-color:#f6f6f6}.editormd-tab-head{list-style:none;border-bottom:1px solid #ddd}.editormd-tab-head li{display:inline-block}.editormd-tab-head li a{color:#999;display:block;padding:6px 12px 5px;text-align:center;text-decoration:none;margin-bottom:-1px;border:1px solid #ddd;-moz-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-top-right-radius:3px;border-top-right-radius:3px;background:#f6f6f6;-webkit-transition:all 300ms ease-out;transition:all 300ms ease-out}.editormd-tab-head li a:hover{color:#666;background:#eee}.editormd-tab-head li.active a{color:#666;background:#fff;border-bottom-color:#fff}.editormd-tab-head li+li{margin-left:3px}.editormd-tab-box{padding:20px 0}.editormd-form{color:#666}.editormd-form label{float:left;display:block;width:75px;text-align:left;padding:7px 0 15px 5px;margin:0 0 2px;font-weight:400}.editormd-form iframe{display:none}.editormd-form input:focus{outline:0}.editormd-form input[type=text],.editormd-form input[type=number]{color:#999;padding:8px;border:1px solid #ddd}.editormd-form input[type=number]{width:40px;display:inline-block;padding:6px 8px}.editormd-form input[type=text]{display:inline-block;width:264px}.editormd-form .fa-btns{display:inline-block}.editormd-form .fa-btns a{color:#999;padding:7px 10px 0 0;display:inline-block;text-decoration:none;text-align:center}.editormd-form .fa-btns .fa{font-size:1.3em}.editormd-form .fa-btns label{float:none;display:inline-block;width:auto;text-align:left;padding:0 0 0 5px;cursor:pointer}.fa-fw,.fa-li{text-align:center}.editormd-dialog-container .editormd-btn,.editormd-dialog-container button,.editormd-dialog-container input[type=submit],.editormd-dialog-footer .editormd-btn,.editormd-dialog-footer button,.editormd-dialog-footer input[type=submit],.editormd-form .editormd-btn,.editormd-form button,.editormd-form input[type=submit]{color:#666;min-width:75px;cursor:pointer;background:#fff;padding:7px 10px;border:1px solid #ddd;border-radius:3px;-webkit-transition:background 300ms ease-out;transition:background 300ms ease-out}.editormd-dialog-container .editormd-btn:hover,.editormd-dialog-container button:hover,.editormd-dialog-container input[type=submit]:hover,.editormd-dialog-footer .editormd-btn:hover,.editormd-dialog-footer button:hover,.editormd-dialog-footer input[type=submit]:hover,.editormd-form .editormd-btn:hover,.editormd-form button:hover,.editormd-form input[type=submit]:hover{background:#eee}.editormd-dialog-container .editormd-btn+.editormd-btn,.editormd-dialog-footer .editormd-btn+.editormd-btn,.editormd-form .editormd-btn+.editormd-btn{margin-left:8px}.editormd-file-input{width:75px;height:32px;margin-left:8px;position:relative;display:inline-block}.editormd-file-input input[type=file]{width:75px;height:32px;opacity:0;cursor:pointer;background:#000;display:inline-block;position:absolute;top:0;right:0}.editormd-file-input input[type=file]::-webkit-file-upload-button{visibility:hidden}.editormd-file-input:hover input[type=submit]{background:#eee}.editormd .CodeMirror,.editormd-preview{display:inline-block;width:50%;height:100%;vertical-align:top;box-sizing:border-box;margin:0}.editormd-preview{position:absolute;top:35px;right:0;overflow:auto;line-height:1.6;display:none;background:#fff}.fa,.fa-stack{display:inline-block}.editormd .CodeMirror{z-index:10;float:left;border-right:1px solid #ddd;font-size:14px;font-family:"YaHei Consolas Hybrid",Consolas,"微软雅黑","Meiryo UI","Malgun Gothic","Segoe UI","Trebuchet MS",Helvetica,Monaco,courier,monospace;line-height:1.6;margin-top:35px}.editormd .CodeMirror pre{font-size:14px;padding:0 12px}.editormd .CodeMirror-linenumbers{padding:0 5px}.editormd .CodeMirror-focused .CodeMirror-selected,.editormd .CodeMirror-selected{background:#70B7FF}.editormd .CodeMirror,.editormd .CodeMirror-scroll,.editormd .editormd-preview{-webkit-overflow-scrolling:touch}.editormd .styled-background{background-color:#ff7}.editormd .CodeMirror-focused .cm-matchhighlight{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAFklEQVQI12NgYGBgkKzc8x9CMDAwAAAmhwSbidEoSQAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x}.editormd .CodeMirror-empty.CodeMirror-focused{outline:0}.editormd .CodeMirror pre.CodeMirror-placeholder{color:#999}.editormd .cm-trailingspace{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAYAAAB/qH1jAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QUXCToH00Y1UgAAACFJREFUCNdjPMDBUc/AwNDAAAFMTAwMDA0OP34wQgX/AQBYgwYEx4f9lQAAAABJRU5ErkJggg==);background-position:bottom left;background-repeat:repeat-x}.editormd .cm-tab{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=) right no-repeat}/*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 *//*! + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.3.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0) format("embedded-opentype"),url(../fonts/fontawesome-webfont.woff2?v=4.3.0) format("woff2"),url(../fonts/fontawesome-webfont.woff?v=4.3.0) format("woff"),url(../fonts/fontawesome-webfont.ttf?v=4.3.0) format("truetype"),url(../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-transform:translate(0, 0);transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before,.fa-genderless:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}/*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */@font-face{font-family:editormd-logo;src:url(../fonts/editormd-logo.eot?-5y8q6h);src:url(.../fonts/editormd-logo.eot?#iefix-5y8q6h) format("embedded-opentype"),url(../fonts/editormd-logo.woff?-5y8q6h) format("woff"),url(../fonts/editormd-logo.ttf?-5y8q6h) format("truetype"),url(../fonts/editormd-logo.svg?-5y8q6h#icomoon) format("svg");font-weight:400;font-style:normal}.editormd-logo,.editormd-logo-1x,.editormd-logo-2x,.editormd-logo-3x,.editormd-logo-4x,.editormd-logo-5x,.editormd-logo-6x,.editormd-logo-7x,.editormd-logo-8x{font-family:editormd-logo;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;font-size:inherit;line-height:1;display:inline-block;text-rendering:auto;vertical-align:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.markdown-body hr:after,.markdown-body hr:before{content:"";display:table}.editormd-logo-1x:before,.editormd-logo-2x:before,.editormd-logo-3x:before,.editormd-logo-4x:before,.editormd-logo-5x:before,.editormd-logo-6x:before,.editormd-logo-7x:before,.editormd-logo-8x:before,.editormd-logo:before{content:"\e1987"}.editormd-logo-1x{font-size:1em}.editormd-logo-lg{font-size:1.2em}.editormd-logo-2x{font-size:2em}.editormd-logo-3x{font-size:3em}.editormd-logo-4x{font-size:4em}.editormd-logo-5x{font-size:5em}.editormd-logo-6x{font-size:6em}.editormd-logo-7x{font-size:7em}.editormd-logo-8x{font-size:8em}.editormd-logo-color{color:#2196F3}/*! github-markdown-css | The MIT License (MIT) | Copyright (c) Sindre Sorhus (sindresorhus.com) | https://github.com/sindresorhus/github-markdown-css */@font-face{font-family:octicons-anchor;src:url(data:font/woff;charset=utf-8;base64,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) format("woff")}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#333;overflow:hidden;font-family:"Microsoft YaHei",Helvetica,"Meiryo UI","Malgun Gothic","Segoe UI","Trebuchet MS",Monaco,monospace,Tahoma,STXihei,"华文细黑",STHeiti,"Helvetica Neue","Droid Sans","wenquanyi micro hei",FreeSans,Arimo,Arial,SimSun,"宋体",Heiti,"黑体",sans-serif;font-size:16px;line-height:1.6;word-wrap:break-word}.markdown-body strong{font-weight:700}.markdown-body h1{margin:.67em 0}.markdown-body img{border:0}.markdown-body hr{box-sizing:content-box;height:0}.markdown-body input{color:inherit;margin:0;line-height:normal;font:13px/1.4 Helvetica,arial,freesans,clean,sans-serif,"Segoe UI Emoji","Segoe UI Symbol"}.markdown-body html input[disabled]{cursor:default}.markdown-body input[type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body a{background:0 0;color:#4183c4;text-decoration:none}.markdown-body a:active,.markdown-body a:hover{outline:0;text-decoration:underline}.markdown-body hr{margin:15px 0;overflow:hidden;background:0 0;border:0;border-bottom:1px solid #ddd}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eee}.markdown-body blockquote{margin:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace}.markdown-body pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;word-wrap:normal}.markdown-body .octicon{font:normal normal 16px octicons-anchor;line-height:1;display:inline-block;text-decoration:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.markdown-body .octicon-link:before{content:'\f05c'}.markdown-body>:first-child{margin-top:0 !important}.markdown-body>:last-child{margin-bottom:0 !important}.markdown-body .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown-body .anchor:focus{outline:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{display:inline-block}.markdown-body h1{font-size:2.25em;line-height:1.2}.markdown-body h1 .anchor{line-height:1}.markdown-body h2{font-size:1.75em;line-height:1.225}.markdown-body h2 .anchor{line-height:1}.markdown-body h3{font-size:1.5em;line-height:1.43}.markdown-body h3 .anchor,.markdown-body h4 .anchor{line-height:1.2}.markdown-body h4{font-size:1.25em}.markdown-body h5 .anchor,.markdown-body h6 .anchor{line-height:1.1}.markdown-body h5{font-size:1em}.markdown-body h6{font-size:1em;color:#777}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body table{border-collapse:collapse;border-spacing:0;display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{max-width:100%;box-sizing:border-box}.markdown-body code{padding:.2em 0;margin:0;font-size:85%;background-color:rgba(0,0,0,0.04);border-radius:3px}.markdown-body code:after,.markdown-body code:before{letter-spacing:-.2em;content:"\00a0"}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;background-color:#f7f7f7;border-radius:3px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body pre code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code:after,.markdown-body pre code:before{content:normal}.markdown-body .pl-c{color:#969896}.markdown-body .pl-c1,.markdown-body .pl-mdh,.markdown-body .pl-mm,.markdown-body .pl-mp,.markdown-body .pl-mr,.markdown-body .pl-s1 .pl-v,.markdown-body .pl-s3,.markdown-body .pl-sc,.markdown-body .pl-sv{color:#0086b3}.markdown-body .pl-e,.markdown-body .pl-en{color:#795da3}.markdown-body .pl-s1 .pl-s2,.markdown-body .pl-smi,.markdown-body .pl-smp,.markdown-body .pl-stj,.markdown-body .pl-vo,.markdown-body .pl-vpf{color:#333}.markdown-body .pl-ent{color:#63a35c}.markdown-body .pl-k,.markdown-body .pl-s,.markdown-body .pl-st{color:#a71d5d}.markdown-body .pl-pds,.markdown-body .pl-s1,.markdown-body .pl-s1 .pl-pse .pl-s2,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre,.markdown-body .pl-src{color:#df5000}.markdown-body .pl-mo,.markdown-body .pl-v{color:#1d3e81}.markdown-body .pl-id{color:#b52a1d}.markdown-body .pl-ii{background-color:#b52a1d;color:#f8f8f8}.markdown-body .pl-sr .pl-cce{color:#63a35c;font-weight:700}.markdown-body .pl-ml{color:#693a17}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:#1d3e81;font-weight:700}.markdown-body .pl-mq{color:teal}.markdown-body .pl-mi{color:#333;font-style:italic}.markdown-body .pl-mb{color:#333;font-weight:700}.markdown-body .pl-md,.markdown-body .pl-mdhf{background-color:#ffecec;color:#bd2c00}.markdown-body .pl-mdht,.markdown-body .pl-mi1{background-color:#eaffea;color:#55a532}.markdown-body .pl-mdr{color:#795da3;font-weight:700}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:1px solid #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{float:left;margin:.3em 0 .25em -1.6em;vertical-align:middle}.markdown-body :checked+.radio-label{z-index:1;position:relative;border-color:#4183c4}.editormd-html-preview,.editormd-preview-container{text-align:left;font-size:14px;line-height:1.6;padding:20px;overflow:auto;width:100%;background-color:#fff}.editormd-html-preview blockquote,.editormd-preview-container blockquote{color:#666;border-left:4px solid #ddd;padding-left:20px;margin-left:0;font-size:14px;font-style:italic}.editormd-html-preview p code,.editormd-preview-container p code{margin-left:5px;margin-right:4px}.editormd-html-preview abbr,.editormd-preview-container abbr{background:#ffd}.editormd-html-preview hr,.editormd-preview-container hr{height:1px;border:none;border-top:1px solid #ddd;background:0 0}.editormd-html-preview code,.editormd-preview-container code{border:1px solid #ddd;background:#f6f6f6;padding:3px;border-radius:3px;font-size:14px}.editormd-html-preview pre,.editormd-preview-container pre{border:1px solid #ddd;background:#f6f6f6;padding:10px;border-radius:3px}.editormd-html-preview pre code,.editormd-preview-container pre code{padding:0}.editormd-html-preview code,.editormd-html-preview kbd,.editormd-html-preview pre,.editormd-preview-container code,.editormd-preview-container kbd,.editormd-preview-container pre{font-family:"YaHei Consolas Hybrid",Consolas,"Meiryo UI","Malgun Gothic","Segoe UI","Trebuchet MS",Helvetica,monospace,monospace}.editormd-html-preview table thead tr,.editormd-preview-container table thead tr{background-color:#F8F8F8}.editormd-html-preview p.editormd-tex,.editormd-preview-container p.editormd-tex{text-align:center}.editormd-html-preview span.editormd-tex,.editormd-preview-container span.editormd-tex{margin:0 5px}.editormd-html-preview .emoji,.editormd-preview-container .emoji{width:24px;height:24px}.editormd-html-preview .katex,.editormd-preview-container .katex{font-size:1.4em}.editormd-html-preview .flowchart,.editormd-html-preview .sequence-diagram,.editormd-preview-container .flowchart,.editormd-preview-container .sequence-diagram{margin:0 auto;text-align:center}.editormd-html-preview .flowchart svg,.editormd-html-preview .sequence-diagram svg,.editormd-preview-container .flowchart svg,.editormd-preview-container .sequence-diagram svg{margin:0 auto}.editormd-html-preview .flowchart text,.editormd-html-preview .sequence-diagram text,.editormd-preview-container .flowchart text,.editormd-preview-container .sequence-diagram text{font-size:15px !important;font-family:"YaHei Consolas Hybrid", Consolas, "Microsoft YaHei", "Malgun Gothic", "Segoe UI", Helvetica, Arial !important}/*! Pretty printing styles. Used with prettify.js. */.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.clo,.opn,.pun{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print, projection{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}.editormd-html-preview pre.prettyprint,.editormd-preview-container pre.prettyprint{padding:10px;border:1px solid #ddd;white-space:pre-wrap;word-wrap:break-word}.editormd-html-preview ol.linenums,.editormd-preview-container ol.linenums{color:#999;padding-left:2.5em}.editormd-html-preview ol.linenums li,.editormd-preview-container ol.linenums li{list-style-type:decimal}.editormd-html-preview ol.linenums li code,.editormd-preview-container ol.linenums li code{border:none;background:0 0;padding:0}.editormd-html-preview .editormd-toc-menu,.editormd-preview-container .editormd-toc-menu{margin:8px 0 12px;display:inline-block}.editormd-html-preview .editormd-toc-menu>.markdown-toc,.editormd-preview-container .editormd-toc-menu>.markdown-toc{position:relative;border-radius:4px;border:1px solid #ddd;display:inline-block;font-size:1em}.editormd-html-preview .editormd-toc-menu>.markdown-toc>ul,.editormd-preview-container .editormd-toc-menu>.markdown-toc>ul{width:160%;min-width:180px;position:absolute;left:-1px;top:-2px;z-index:100;padding:0 10px 10px;display:none;background:#fff;border:1px solid #ddd;border-radius:4px;-ms-box-shadow:0 3px 5px rgba(0,0,0,0.2);-o-box-shadow:0 3px 5px rgba(0,0,0,0.2);box-shadow:0 3px 5px rgba(0,0,0,0.2)}.editormd-html-preview .editormd-toc-menu>.markdown-toc>ul>li ul,.editormd-preview-container .editormd-toc-menu>.markdown-toc>ul>li ul{width:100%;min-width:180px;border:1px solid #ddd;display:none;background:#fff;border-radius:4px}.editormd-html-preview .editormd-toc-menu .toc-menu-btn:hover,.editormd-html-preview .editormd-toc-menu>.markdown-toc>ul>li a:hover,.editormd-preview-container .editormd-toc-menu .toc-menu-btn:hover,.editormd-preview-container .editormd-toc-menu>.markdown-toc>ul>li a:hover{background-color:#f6f6f6}.editormd-html-preview .editormd-toc-menu>.markdown-toc>ul>li a,.editormd-preview-container .editormd-toc-menu>.markdown-toc>ul>li a{color:#666;padding:6px 10px;display:block;-webkit-transition:background-color 500ms ease-out;transition:background-color 500ms ease-out}.editormd-html-preview .editormd-toc-menu>.markdown-toc li,.editormd-preview-container .editormd-toc-menu>.markdown-toc li{position:relative}.editormd-html-preview .editormd-toc-menu>.markdown-toc li>ul,.editormd-preview-container .editormd-toc-menu>.markdown-toc li>ul{position:absolute;top:32px;left:10%;display:none;-ms-box-shadow:0 3px 5px rgba(0,0,0,0.2);-o-box-shadow:0 3px 5px rgba(0,0,0,0.2);box-shadow:0 3px 5px rgba(0,0,0,0.2)}.editormd-html-preview .editormd-toc-menu>.markdown-toc li>ul:after,.editormd-html-preview .editormd-toc-menu>.markdown-toc li>ul:before,.editormd-preview-container .editormd-toc-menu>.markdown-toc li>ul:after,.editormd-preview-container .editormd-toc-menu>.markdown-toc li>ul:before{pointer-events:pointer-events;position:absolute;left:15px;top:-6px;display:block;content:"";width:0;height:0;border:6px solid transparent;border-width:0 6px 6px;z-index:10}.editormd-html-preview .editormd-toc-menu>.markdown-toc li>ul:before,.editormd-preview-container .editormd-toc-menu>.markdown-toc li>ul:before{border-bottom-color:#ccc}.editormd-html-preview .editormd-toc-menu>.markdown-toc li>ul:after,.editormd-preview-container .editormd-toc-menu>.markdown-toc li>ul:after{border-bottom-color:#fff;top:-5px}.editormd-html-preview .editormd-toc-menu ul,.editormd-preview-container .editormd-toc-menu ul{list-style:none}.editormd-html-preview .editormd-toc-menu a,.editormd-preview-container .editormd-toc-menu a{text-decoration:none}.editormd-html-preview .editormd-toc-menu h1,.editormd-preview-container .editormd-toc-menu h1{font-size:16px;padding:5px 0 10px 10px;line-height:1;border-bottom:1px solid #eee}.editormd-html-preview .editormd-toc-menu h1 .fa,.editormd-preview-container .editormd-toc-menu h1 .fa{padding-left:10px}.editormd-html-preview .editormd-toc-menu .toc-menu-btn,.editormd-preview-container .editormd-toc-menu .toc-menu-btn{color:#666;min-width:180px;padding:5px 10px;border-radius:4px;display:inline-block;-webkit-transition:background-color 500ms ease-out;transition:background-color 500ms ease-out}.editormd-html-preview textarea,.editormd-onlyread .editormd-toolbar{display:none}.editormd-html-preview .editormd-toc-menu .toc-menu-btn .fa,.editormd-preview-container .editormd-toc-menu .toc-menu-btn .fa{float:right;padding:3px 0 0 10px;font-size:1.3em}.markdown-body .editormd-toc-menu ul{padding-left:0}.markdown-body .highlight pre,.markdown-body pre{line-height:1.6}hr.editormd-page-break{border:1px dotted #ccc;font-size:0;height:2px}@media only print{hr.editormd-page-break{background:0 0;border:none;height:0}}.editormd-html-preview hr.editormd-page-break{background:0 0;border:none;height:0}.editormd-preview-close-btn{color:#fff;padding:4px 6px;font-size:18px;border-radius:500px;display:none;background-color:#ccc;position:absolute;top:25px;right:35px;z-index:19;-webkit-transition:background-color 300ms ease-out;transition:background-color 300ms ease-out}.editormd-preview-close-btn:hover{background-color:#999}.editormd-preview-active{width:100%;padding:40px}.editormd-preview-theme-dark{color:#777;background:#2C2827}.editormd-preview-theme-dark .editormd-preview-container{color:#888;background-color:#2C2827}.editormd-preview-theme-dark .editormd-preview-container pre.prettyprint{border:none}.editormd-preview-theme-dark .editormd-preview-container blockquote{color:#555;padding:.5em;background:#222;border-color:#333}.editormd-preview-theme-dark .editormd-preview-container abbr{color:#fff;padding:1px 3px;border-radius:3px;background:#f90}.editormd-preview-theme-dark .editormd-preview-container code{color:#fff;border:none;padding:1px 3px;border-radius:3px;background:#5A9600}.editormd-preview-theme-dark .editormd-preview-container table{border:none}.editormd-preview-theme-dark .editormd-preview-container .fa-emoji{color:#B4BF42}.editormd-preview-theme-dark .editormd-preview-container .katex{color:#FEC93F}.editormd-preview-theme-dark .editormd-toc-menu>.markdown-toc{background:#fff;border:none}.editormd-preview-theme-dark .editormd-toc-menu>.markdown-toc h1{border-color:#ddd}.editormd-preview-theme-dark .markdown-body h1,.editormd-preview-theme-dark .markdown-body h2,.editormd-preview-theme-dark .markdown-body hr{border-color:#222}.editormd-preview-theme-dark pre{color:#999;background-color:#111;background-color:rgba(0,0,0,0.4)}.editormd-preview-theme-dark pre .pln{color:#999}.editormd-preview-theme-dark li.L1,.editormd-preview-theme-dark li.L3,.editormd-preview-theme-dark li.L5,.editormd-preview-theme-dark li.L7,.editormd-preview-theme-dark li.L9{background:0 0}.editormd-preview-theme-dark [class*=editormd-logo]{color:#2196F3}.editormd-preview-theme-dark .sequence-diagram text{fill:#fff}.editormd-preview-theme-dark .sequence-diagram path,.editormd-preview-theme-dark .sequence-diagram rect{color:#fff;fill:#64D1CB;stroke:#64D1CB}.editormd-preview-theme-dark .flowchart path,.editormd-preview-theme-dark .flowchart rect{stroke:#A6C6FF}.editormd-preview-theme-dark .flowchart rect{fill:#A6C6FF}.editormd-preview-theme-dark .flowchart text{fill:#5879B4}@media screen{.editormd-preview-theme-dark .str{color:#080}.editormd-preview-theme-dark .kwd{color:#f90}.editormd-preview-theme-dark .com{color:#444}.editormd-preview-theme-dark .typ{color:#606}.editormd-preview-theme-dark .lit{color:#066}.editormd-preview-theme-dark .clo,.editormd-preview-theme-dark .opn,.editormd-preview-theme-dark .pun{color:#660}.editormd-preview-theme-dark .tag{color:#f90}.editormd-preview-theme-dark .atn{color:#6C95F5}.editormd-preview-theme-dark .atv{color:#080}.editormd-preview-theme-dark .dec,.editormd-preview-theme-dark .var{color:#008BA7}.editormd-preview-theme-dark .fun{color:red}}.editormd-onlyread .CodeMirror{margin-top:0}.editormd-onlyread .editormd-preview{top:0}.editormd-fullscreen{position:fixed;top:0;left:0;border:none;margin:0 auto}.editormd-theme-dark{border-color:#1a1a17}.editormd-theme-dark .editormd-toolbar{background:#1A1A17;border-color:#1a1a17}.editormd-theme-dark .editormd-menu>li>a{color:#777;border-color:#1a1a17}.editormd-theme-dark .editormd-menu>li>a.active,.editormd-theme-dark .editormd-menu>li>a:hover{border-color:#333;background:#333}.editormd-theme-dark .editormd-menu>li.divider{border-right:1px solid #111}.editormd-theme-dark .CodeMirror{border-right:1px solid rgba(0,0,0,0.1)}.gu-mirror{position:fixed !important;margin:0 !important;z-index:9999 !important;opacity:0.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none !important}.gu-unselectable{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.gu-transit{opacity:0.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}body{font-size:14px;background:#efefef}a:hover{text-decoration:unset}textarea.danger,input.danger{border-color:#dc3545 !important}label.error{color:#dc3545 !important}input.form-control{font-size:14px}.input-group-prepend .input-group-text{font-size:14px}.flex-1{-webkit-box-flex:1;flex:1}.fl{float:left}.no_padding{padding:0px !important}.font-12{font-size:12px !important}.font-14{font-size:14px !important}.font-16{font-size:16px !important}.font-18{font-size:18px !important}.font-20{font-size:20px !important}.font-24{font-size:24px !important}.padding10-5{padding:10px 5px}.width100{width:100%}.mb10{margin-bottom:10px}.mt10{margin-top:10px}.mr10{margin-right:10px}.ml10{margin-left:10px}.ml20{margin-left:20px}.textarea-width-100{width:100%;resize:none;border:1px solid #ccc}.padding10{padding:10px}.padding5-10{padding:5px 10px}.position-r{position:relative}.color-grey-c{color:#ccc}.color-blue{color:#4CACFF}.color-orange{color:#ff6800}.inline-block{display:inline-block}.hide{display:none}.show{display:block}.input_small{-webkit-box-flex:0 !important;flex:0 0 6% !important}.input_middle{-webkit-box-flex:0 !important;flex:0 0 13% !important}.admins-auth-schools-index-page .list-item-title{padding-bottom:5px;padding-left:33px;color:#555}.admins-auth-schools-index-page .list-item-title-1{width:100px;display:inline-block}.admins-auth-schools-index-page .list-item-title-2{width:200px;display:inline-block}.admins-auth-schools-index-page .collegeManage{float:left;padding:0px 8px;border-radius:6px;background-color:#f5f5f5;margin:3px 0px 3px 10px;height:34px;line-height:34px}.admins-auth-schools-index-page .collegeManage a{color:#05101a}.admins-auth-schools-index-page .collegeManage a:hover{color:#007bff}.admins-auth-schools-index-page i:hover{color:#333}.admins-auth-schools-index-page .add-manager-i{float:left}.admins-auth-schools-index-page .add-manager-i i{padding:10px 5px}.admins-auth-schools-index-page .auth-schools-new-add .flex-column input,.admins-auth-schools-index-page .auth-schools-user-add .flex-column input{height:38px}.admins-auth-schools-index-page .auth-schools-new-add .search-school,.admins-auth-schools-index-page .auth-schools-user-add .search-school{margin-left:15px}.admins-auth-schools-index-page .school-search-list{background:#F4FAFF;height:280px;overflow-y:scroll;padding:10px 0}.admins-auth-schools-index-page .school-list-item{padding:2px 10px}.admins-auth-schools-index-page .school-list-item input{font-size:20px;margin-right:5px}.admins-carousels-index-page .carousels-card .custom-carousel-item>.drag{cursor:move;background:#fff;box-shadow:1px 2px 5px 3px #f0f0f0}.admins-carousels-index-page .carousels-card .custom-carousel-item-no{font-size:28px;text-align:center}.admins-carousels-index-page .carousels-card .custom-carousel-item-img{cursor:pointer;width:100%;height:60px}.admins-carousels-index-page .carousels-card .custom-carousel-item-img>img{display:block;width:100%;height:60px;background:#F5F5F5}.admins-carousels-index-page .carousels-card .custom-carousel-item .not_active{background:#F0F0F0}.admins-carousels-index-page .carousels-card .custom-carousel-item .delete-btn{font-size:20px;color:red;cursor:pointer}.admins-carousels-index-page .carousels-card .custom-carousel-item .save-url-btn{cursor:pointer}.admins-carousels-index-page .carousels-card .custom-carousel-item .operate-box{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;align-items:center}.admins-carousels-index-page .carousels-card .custom-carousel-item .online-check-box{font-size:20px}.admins-carousels-index-page .carousels-card .custom-carousel-item .name-input{-webkit-box-flex:1;flex:1}.admins-carousels-index-page .carousels-card .custom-carousel-item .link-input{-webkit-box-flex:3;flex:3}.admin-body-container{padding:20px;-webkit-box-flex:1;flex:1;min-height:100vh;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;overflow-y:scroll}.admin-body-container>.content{-webkit-box-flex:1;flex:1;font-size:14px}.admin-body-container>.content .box{padding:20px;border-radius:5px;background:#fff}.admin-body-container .breadcrumb{padding-left:5px;font-size:20px;background:unset}.admin-body-container table{table-layout:fixed}.admin-body-container table td{vertical-align:middle}.admin-body-container table tr.no-data:hover{color:darkgrey;background:unset}.admin-body-container table tr.no-data>td{text-align:center;height:300px}.admin-body-container .image-preview-container{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-align:center;align-items:center}.admin-body-container .action-container>.action{padding:0 3px}.admin-body-container .action-container .more-action-dropdown .dropdown-item{font-size:14px}.admin-body-container .paginate-container{margin-top:20px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}.admin-body-container .paginate-container .paginate-total{margin-bottom:10px;color:darkgrey}.admin-body-container .paginate-container .pagination{margin-bottom:0px}.admin-body-container .search-form-container{display:-webkit-box;display:flex;margin-bottom:20px}.admin-body-container .search-form-container .search-form{-webkit-box-flex:1;flex:1}.admin-body-container .search-form-container .search-form *{font-size:14px}.admin-body-container .search-form-container .search-form select,.admin-body-container .search-form-container .search-form input{margin-right:10px;font-size:14px}.admin-body-container .admin-list-container{overflow-x:scroll}.admin-body-container .admin-list-container>table{min-width:900px}.admin-body-container .global-error{color:grey;min-height:300px}.admin-body-container .global-error-code{font-size:80px}.admin-body-container .global-error-text{font-size:24px}.admin-body-container .nav-tabs .nav-link{padding:0.5rem 2rem}.admin-body-container .CodeMirror{border:1px solid #ced4da}.admin-body-container .batch-action-container{padding:10px 20px 0;background:#fff}.admin-body-container .mt-10{margin-top:10px}.admins-competition-settings-index-page .competition-mode-container .row{height:35px}.admins-competition-settings-index-page .competition-mode-container .des-row{height:auto}.admins-competition-settings-index-page .competition-mode-container .form-control{font-size:14px}.admins-competition-settings-index-page .col-md-label{-webkit-box-flex:0;flex:0 0 10%;max-width:10%;min-width:30px;padding-right:15px;padding-left:15px;position:relative}.admins-competition-settings-index-page .col-md-label-s{-webkit-box-flex:0;flex:0 0 30px;padding-right:15px;padding-left:15px;position:relative}.admins-competition-settings-index-page .setBtn_s{height:35px;line-height:20px}.admins-competition-settings-index-page .sponsor_label{border:1px solid #4CACFF;border-radius:5px;background-color:rgba(76,172,255,0.3);color:#333;padding:0px 4px;height:30px;line-height:30px;float:left;margin:4px 5px}.admins-competition-settings-index-page .sponsor_label span{display:block;float:left;height:28px;line-height:28px;margin-right:5px}.admins-competition-settings-index-page .sponsor_label a{font-size:18px;float:left;height:28px;line-height:28px}.admins-competition-settings-index-page .large_panel{padding:0px 15px}.admins-competition-settings-index-page .large_panel .large_panel_part{border-top:1px solid #eaeaea}.admins-competition-settings-index-page .large_panel .large_panel_part:first-child{border:none}.admins-competition-settings-index-page .large_panel .large_panel_part>.row,.admins-competition-settings-index-page .large_panel .small_panel>.row{border-bottom:1px solid #eaeaea;padding:20px 0px}.admins-competition-settings-index-page .large_panel .small_panel{margin-left:20px}.admins-competition-settings-index-page .large_panel .row:last-child{border:none}.admins-competition-settings-index-page .large_panel .task_Input_div:nth-child(3n-2)>span.col-4{-webkit-box-flex:0;flex:0 0 81px;max-width:81px}.admins-competition-settings-index-page .large_panel .task_Input_div:nth-child(3n-2){-webkit-box-flex:0;flex:0 0 50%;max-width:50%}.admins-competition-settings-index-page .large_panel .task_Input_div:nth-child(3n-1){-webkit-box-flex:0;flex:0 0 25%;max-width:25%}.admins-competition-settings-index-page .large_panel .task_Input_div:nth-child(3n){-webkit-box-flex:0;flex:0 0 25%;max-width:25%}.admins-competition-settings-index-page .large_panel .task_Input_div:nth-child(3n)>span.col-4{-webkit-box-flex:0;flex:0 0 33.3%;max-width:33.3%}.admins-competition-settings-index-page .large_panel .task_Input_div:nth-child(3n)>div.col-6{-webkit-box-flex:0;flex:0 0 50%;max-width:50%}.admins-cooperatives-index-page .coo-img-card .coo-img-item>.drag{cursor:move;background:#fff;box-shadow:1px 2px 5px 3px #f0f0f0}.admins-cooperatives-index-page .coo-img-card .coo-img-item-img{cursor:pointer;width:100%;height:40px;margin-bottom:10px}.admins-cooperatives-index-page .coo-img-card .coo-img-item-img>img{width:100%;height:40px}.admins-cooperatives-index-page .coo-img-card .coo-img-item .delete-btn{position:absolute;top:3px;right:20px;color:red;cursor:pointer}.admins-cooperatives-index-page .coo-img-card .coo-img-item .save-url-btn{cursor:pointer}.admins-daily-school-statistics-index-page .daily-school-statistic-list-container{text-align:center}.admins-dashboards-index-page .pie-statistic .pie{height:300px}.admins-departments-index-page .department-list-table .member-container .member-user{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;flex-wrap:wrap}.admins-departments-index-page .department-list-table .member-container .member-user .member-user-item{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;height:22px;line-height:22px;padding:2px 5px;margin:2px 2px;border:1px solid #91D5FF;background-color:#E6F7FF;color:#91D5FF;border-radius:4px}.admins-ec-templates-index-page .template-file-upload{padding:10px;background:#fafafa;border:1px dashed #ccc;text-align:center;color:#999;position:relative;width:100%}.admins-ec-templates-index-page input[name='file']{opacity:0;position:absolute;display:inline-block;left:0;height:43px;top:0;width:100%;cursor:pointer}.admins-identity-authentications-index-page .identity-authentication-list-container span.apply-status-1{color:#28a745}.admins-identity-authentications-index-page .identity-authentication-list-container span.apply-status-2{color:#dc3545}.admins-identity-authentications-index-page .identity-authentication-list-container span.apply-status-3{color:#6c757d}.admins-laboratories-index-page .laboratory-list-table .member-container .laboratory-user{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;flex-wrap:wrap}.admins-laboratories-index-page .laboratory-list-table .member-container .laboratory-user .laboratory-user-item{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;height:22px;line-height:22px;padding:2px 5px;margin:2px 2px;border:1px solid #91D5FF;background-color:#E6F7FF;color:#91D5FF;border-radius:4px}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item{display:-webkit-box;display:flex}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-img,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-img{display:block;width:80px;height:80px;background:#f0f0f0}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload{cursor:pointer;position:absolute;top:0;width:80px;height:80px;background:#F5F5F5;border:1px solid #E5E5E5}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload::before,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload::before{content:'';position:absolute;top:27px;left:39px;width:2px;height:26px;background:#E5E5E5}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload::after,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload::after{content:'';position:absolute;top:39px;left:27px;width:26px;height:2px;background:#E5E5E5}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left{position:relative;width:80px;height:80px}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left.has-img .logo-item-upload,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left.has-img .logo-item-upload{display:none}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left.has-img:hover .logo-item-upload,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left.has-img:hover .logo-item-upload{display:block;background:rgba(145,145,145,0.8)}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-right,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-right{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:justify;justify-content:space-between;color:#777777;font-size:12px}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-title,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-title{color:#23272B;font-size:14px}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item{margin-bottom:15px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-img,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-img{display:block;width:300px;height:80px;background:#f0f0f0}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-upload,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-upload{cursor:pointer;position:absolute;top:0;width:300px;height:80px;background:#F5F5F5;border:1px solid #E5E5E5}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-upload::before,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-upload::before{content:'';position:absolute;top:27px;left:149px;width:2px;height:26px;background:#E5E5E5}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-upload::after,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-upload::after{content:'';position:absolute;top:39px;left:137px;width:26px;height:2px;background:#E5E5E5}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-top,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-top{margin-bottom:10px}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-bottom,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-bottom{position:relative;width:300px;height:80px}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-bottom.has-img .banner-item-upload,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-bottom.has-img .banner-item-upload{display:none}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-bottom.has-img:hover .banner-item-upload,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-bottom.has-img:hover .banner-item-upload{display:block;background:rgba(145,145,145,0.8)}.admins-laboratory-settings-show-page .edit-laboratory-setting-container .banner-item-title,.admins-laboratory-settings-update-page .edit-laboratory-setting-container .banner-item-title{color:#23272B;font-size:14px}.admins-library-applies-index-page .library-applies-list-container span.apply-status-agreed{color:#28a745}.admins-library-applies-index-page .library-applies-list-container span.apply-status-refused{color:#dc3545}.admins-library-applies-index-page .library-applies-list-container span.apply-status-processed{color:#6c757d}.admins-major-informations-index-page .fr{float:right}.admins-major-informations-index-page .panel-default{margin-bottom:10px;background-color:whitesmoke}.admins-major-informations-index-page .panel-default .panel-heading i{margin-right:15px;font-size:16px;color:#cccccc}.admins-major-informations-index-page .panel-default .panel-heading a{padding:8px 10px;display:inline-block;width:100%;color:#666666}.admins-major-informations-index-page .panel-default .panel-collapse{padding-top:10px;background:#fff}.admins-major-informations-index-page .panel-default .panel-collapse table{text-align:center}.admins-major-informations-index-page .panel-default .panel-collapse table th,.admins-major-informations-index-page .panel-default .panel-collapse table td{padding:8px}.admins-major-informations-index-page .panel-default .panel-collapse table td{color:#888}.admins-professional-authentications-index-page .professional-authentication-list-container span.apply-status-1{color:#28a745}.admins-professional-authentications-index-page .professional-authentication-list-container span.apply-status-2{color:#dc3545}.admins-professional-authentications-index-page .professional-authentication-list-container span.apply-status-3{color:#6c757d}.admins-project-package-applies-index-page .project-package-applies-list-container span.apply-status-agreed{color:#28a745}.admins-project-package-applies-index-page .project-package-applies-list-container span.apply-status-refused{color:#dc3545}.admins-project-package-applies-index-page .project-package-applies-list-container span.apply-status-processed{color:#6c757d}.admins-school-statistics-index-page .school-statistic-list-form .time-select{-webkit-box-flex:1;flex:1}.admins-school-statistics-index-page .school-statistic-list-form .type-box .btn{margin:0 5px}.admins-school-statistics-index-page .school-statistic-list-form .search-input{width:220px}.admins-school-statistics-index-page .school-statistic-list-form .contrast-date-container{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.admins-school-statistics-index-page .school-statistic-list-container .contrast-column-select{position:absolute;right:30px;top:15px;width:130px}.admins-school-statistics-index-page .school-statistic-list-container .relative{position:relative}.admins-school-statistics-index-page .school-statistic-list-container .right-border::after{position:absolute;top:10px;right:0;content:'';width:0;height:20px;border-right:1px solid #000}.admins-shixuns-index-page .shixuns-list-container .shixuns-status-1{color:#6c757d}.admins-shixuns-index-page .shixuns-list-container .shixuns-status-2{color:#28a745}.admins-shixuns-index-page .shixuns-list-container .shixuns-status-3{color:#dc3545}.admins-shixun-authorizations-index-page .shixun-authorization-list-container span.apply-status-1{color:#28a745}.admins-shixun-authorizations-index-page .shixun-authorization-list-container span.apply-status-2{color:#dc3545}.admins-shixun-authorizations-index-page .shixun-authorization-list-container span.apply-status-3{color:#6c757d}.admins-shixun-settings-index-page input[type="checkbox"]{font-size:18px}.admins-shixun-settings-index-page .select2 input::-webkit-input-placeholder{color:#ccc}.admins-shixun-settings-index-page .select2 .select2-selection__choice{border:1px solid #eee !important}.admins-shixun-settings-index-page .setting-chosen{font-weight:400;font-size:10px;color:#333}.admins-shixun-settings-index-page .shixun-setting-image{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-align:center;align-items:center}#sidebar{min-width:200px;max-width:200px;background:#272822;color:#fff;-webkit-transition:all 0.5s;transition:all 0.5s;overflow-y:scroll}#sidebar::-webkit-scrollbar{display:none}#sidebar.active{min-width:60px;max-width:60px;text-align:center}#sidebar.active .sidebar-header{padding:10px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}#sidebar.active .sidebar-header-logo{overflow:hidden;margin-bottom:10px}#sidebar.active .sidebar-header-logo>.logo-label{display:none}#sidebar.active ul li a{padding:10px;text-align:center;font-size:0.85em;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center}#sidebar.active ul li a span{display:none}#sidebar.active ul li a i{margin-right:0;display:block;font-size:1.8em;margin-bottom:5px;width:30px;height:20px}#sidebar.active .dropdown-toggle::after{top:auto;bottom:10px;right:50%;-webkit-transform:translateX(50%);transform:translateX(50%)}#sidebar.active ul ul a{padding:10px !important}#sidebar.active ul ul a span{display:none}#sidebar.active ul ul a i{margin-left:0px;display:block;font-size:0.8em;width:30px;height:10px}#sidebar .sidebar-header{padding:20px;background:#272822;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-pack:justify;justify-content:space-between}#sidebar .sidebar-header-logo{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;align-items:center}#sidebar .sidebar-header-logo>img{max-width:130px !important;max-height:40px !important;overflow:hidden}#sidebar .sidebar-header-logo>.logo-label{font-size:18px;color:darkgrey;margin-left:10px}#sidebar #sidebarCollapse{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;cursor:pointer;text-align:right}#sidebar #sidebarCollapse.active{width:40px;height:30px;background:#3f3f3f;border:1px solid grey;border-radius:3px}#sidebar #sidebarCollapse.active i.fold{display:none}#sidebar #sidebarCollapse.active i.unfold{display:block}#sidebar #sidebarCollapse i.fold{display:block}#sidebar #sidebarCollapse i.unfold{display:none}#sidebar a,#sidebar a:hover,#sidebar a:focus{color:inherit;text-decoration:none;-webkit-transition:all 0.3s;transition:all 0.3s}#sidebar>ul>li>a>i{width:14px;height:14px}#sidebar ul.components{padding:20px 0;border-bottom:1px solid #3f3f3f}#sidebar ul p{color:#fff;padding:10px}#sidebar ul li>a{padding:10px;font-size:1em;display:block;text-align:left}#sidebar ul li>a i{margin-right:10px;font-size:1em;margin-bottom:5px}#sidebar ul li a:hover,#sidebar ul li a.active{color:#fff;background:#276891}#sidebar ul li.active>a,#sidebar ul a[aria-expanded="true"]{color:#fff}#sidebar ul ul a{font-size:0.9em !important;padding-left:30px !important;background:#3f3f3f}@media (max-width: 768px){#sidebar.active{padding:10px 5px;min-width:40px;max-width:40px;text-align:center;margin-left:0;-webkit-transform:none;transform:none}#sidebar.active .sidebar-header{padding:0px}#sidebar.active .sidebar-header .sidebar-header-logo{display:none}#sidebar.active .sidebar-header #sidebarCollapse{width:30px;height:20px}#sidebar.active ul li a{padding:10px;font-size:0.85em}#sidebar.active ul li a i{margin-right:0;display:block;margin-bottom:5px}#sidebar.active>ul>li>a>i{font-size:1.8em}#sidebar.active ul ul a{padding:10px !important}.dropdown-toggle::after{top:auto;bottom:10px;right:50%;-webkit-transform:translateX(50%);transform:translateX(50%)}}.admins-subject-authorizations-index-page .subject-authorization-list-container span.apply-status-1{color:#28a745}.admins-subject-authorizations-index-page .subject-authorization-list-container span.apply-status-2{color:#dc3545}.admins-subject-authorizations-index-page .subject-authorization-list-container span.apply-status-3{color:#6c757d}.admins-users-index-page .users-list-container{text-align:center}.admins-users-edit-page .user-edit-container .user-info-content,.admins-users-update-page .user-edit-container .user-info-content{padding-top:5px;padding-bottom:5px;height:80px}.admins-users-edit-page .user-edit-container .user-info-name,.admins-users-update-page .user-edit-container .user-info-name{-webkit-box-flex:2;flex:2;font-size:16px}.admins-users-edit-page .user-edit-container .user-info-auth,.admins-users-update-page .user-edit-container .user-info-auth{-webkit-box-flex:1;flex:1}.admins-users-edit-page .user-edit-container .user-info-auth i.fa,.admins-users-update-page .user-edit-container .user-info-auth i.fa{margin-right:10px;font-size:16px;width:16px;height:16px;text-align:center}.admins-video-applies-index-page .video-applies-list-container span.apply-status-agreed{color:#28a745}.admins-video-applies-index-page .video-applies-list-container span.apply-status-refused{color:#dc3545}.admins-video-applies-index-page .video-applies-list-container span.apply-status-processed{color:#6c757d}.admins-weapp-adverts-index-page .adverts-card .advert-item>.drag{cursor:move;background:#fff;box-shadow:1px 2px 5px 3px #f0f0f0}.admins-weapp-adverts-index-page .adverts-card .advert-item-no{font-size:28px;text-align:center}.admins-weapp-adverts-index-page .adverts-card .advert-item-img{cursor:pointer;width:100%;height:60px}.admins-weapp-adverts-index-page .adverts-card .advert-item-img>img{display:block;width:100%;height:60px;background:#F5F5F5}.admins-weapp-adverts-index-page .adverts-card .advert-item .not_active{background:#F0F0F0}.admins-weapp-adverts-index-page .adverts-card .advert-item .delete-btn{font-size:20px;color:red;cursor:pointer}.admins-weapp-adverts-index-page .adverts-card .advert-item .save-url-btn{cursor:pointer}.admins-weapp-adverts-index-page .adverts-card .advert-item .operate-box{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;align-items:center}.admins-weapp-adverts-index-page .adverts-card .advert-item .online-check-box{font-size:20px}.admins-weapp-adverts-index-page .adverts-card .advert-item .name-input{-webkit-box-flex:1;flex:1}.admins-weapp-adverts-index-page .adverts-card .advert-item .link-input{-webkit-box-flex:3;flex:3}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item>.drag{cursor:move;background:#fff;box-shadow:1px 2px 5px 3px #f0f0f0}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item-no{font-size:28px;text-align:center}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item-img{cursor:pointer;width:100%;height:60px}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item-img>img{display:block;width:100%;height:60px;background:#F5F5F5}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item .not_active{background:#F0F0F0}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item .delete-btn{font-size:20px;color:red;cursor:pointer}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item .save-url-btn{cursor:pointer}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item .operate-box{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;align-items:center}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item .online-check-box{font-size:20px}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item .name-input{-webkit-box-flex:1;flex:1}.admins-weapp-carousels-index-page .carousels-card .custom-carousel-item .link-input{-webkit-box-flex:3;flex:3}body{width:100vw;height:100vh;max-width:100vw;max-height:100vh;display:-webkit-box;display:flex;-webkit-box-align:stretch;align-items:stretch;font-size:14px;background:#efefef;overflow:hidden}.simple_form .form-group .collection_radio_buttons{margin-bottom:0px}.simple_form .form-group .form-check-inline{height:calc(1.5em + 0.75rem + 2px)}input.form-control{font-size:14px}.btn-default{color:#666;background:#e1e1e1 !important}.export-absolute{right:20px;position:absolute}.export-base-absolute{right:100px;position:absolute}.logo-item{display:-webkit-box;display:flex}.logo-item-img{display:block;width:80px;height:80px;background:#e9ecef}.logo-item-upload{cursor:pointer;position:absolute;top:0;width:80px;height:80px;background:#e9ecef;border:1px solid #ced4da}.logo-item-upload::before{content:'';position:absolute;top:27px;left:39px;width:2px;height:26px;background:#495057}.logo-item-upload::after{content:'';position:absolute;top:39px;left:27px;width:26px;height:2px;background:#495057}.logo-item-left{position:relative;width:80px;height:80px}.logo-item-left.has-img .logo-item-upload{display:none}.logo-item-left.has-img:hover .logo-item-upload{display:block;background:rgba(145,145,145,0.8)}.logo-item-right{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:justify;justify-content:space-between;color:#777777;font-size:0.8rem}.logo-item-title{color:#23272B;font-size:1rem}.attachment-item{display:-webkit-box;display:flex}.attachment-item-img{display:block;width:160px;height:160px;background:#e9ecef}.attachment-item-upload{cursor:pointer;position:absolute;top:0;width:160px;height:160px;background:#e9ecef;border:1px solid #ced4da}.attachment-item-upload::before{content:'';position:absolute;top:54px;left:78px;width:2px;height:52px;background:#495057}.attachment-item-upload::after{content:'';position:absolute;top:78px;left:54px;width:52px;height:2px;background:#495057}.attachment-item-left{position:relative;width:160px;height:160px}.attachment-item-left.has-img .attachment-item-upload{display:none}.attachment-item-left.has-img:hover .attachment-item-upload{display:block;background:rgba(145,145,145,0.8)}.attachment-item-right{padding-top:100px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:justify;justify-content:space-between;color:#777777;font-size:0.8rem}.attachment-item-title{color:#23272B;font-size:1rem}.table th,.table td{padding:0.75rem 0.1rem;vertical-align:top;border-top:1px solid #dee2e6}.table .thead-light th{white-space:nowrap} diff --git a/public/assets/admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css.gz b/public/assets/admin-a7edfa013f5e822c43ac1a1f813c1929ff7aa9e12cd1313f9e1b7292fa406470.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..236293e2858862845f90d1f678164728ffe69779 GIT binary patch literal 59480 zcmXWiV|ZO%umIrLwr$(CZL6_u+h)TPoFt9yq>XLs#J1D4x8J>Y|C?vlerDeNbM`FK z1UN9y=5#9v$g4iP49W>NvX7t;>6+2e$^aNK8wfcfZJtM8p@nQ~sx>75cgDum4}FL{ zu=GMPi99h}d$VVyAdPalJd}E>i;_4D>5HQ!@wjxl^RMzRMAq49J|PN9b>Mlnj-v{A z?A`xAv3GBKqF;YW`aU`Tjs&cI8Wr768lyY)(f-;k!SzMe>Dg)T4ScfAyRsH);hkGc zA+dOyJKZXvFs}DD*+UIy`QUsG4$gw}73tZldnn_AFsY`d+uIR?a+$hI&Q3meE%OFW+`n*RPh7kvDyc;rdAn+a{a zX{+$t=h0%o)azKw$U)7PGOt_rwECni)?0#z!p2R4Q?$8Ef_VtZex~Om-j@nZgcXPE zKmwJF=;1pVQS_OOiBthKOJnSqJew3fuYC6L8s9f|)Zgq1`Z)5<;_zScTr^SM@|mE$ zKY;=xV2=fGr?7`W(Snk_wOUVER}6+6Y0n7y{FGmA)4@K6z(FhI=m^_0OO6CjVr*WE z%So#u7mIv7Y?jwYKaFe(?sMxj#WvXynjNMQoZ-&2sP!A9S2CD9rpkoa&~d1lcq;$i znWdTf0I?N%`Qwj8#4*6NxQYqoZn7*UH^1btQdJQ5duT4+Q&4d^t9xd1?5dsj5;H(K zF5k2~L9v0*Nj=4TijWHXGWoR&>G?DV@E&vYimO(d>~nA4JdJrf5OQC3_+=zA<-@P= z*&zQywNddn{;ANcsy1trz%{8hs;k!jN?rqAv4UNiICl`A>TBZ%`nnSMYwu590;3_) zt3UT}6%N2cWVqHpE$H2r@u0#a4F*k}$-bVZAB!Z+hrYWvPoQu#VyiDF95LO=p<8?1 ztM>pn`9vY0r(Mjl6S5>6Gx_iPj1R_Ojmq1kv79d8@FIomQ0C*>`chsu zDU{)bFeL;IT>k)gE^SDu3fK~v?OT4&-a$&Vh#)zp(O{WzAJP>}l!t0Ub( zdR>OEkv9SQN^o|)zdxoZzMZn{-!nhT>3`)s_bxnd7dozta*2X8ud z%a(^xWV51&>Ah33e{6w8!d_51RDHFAU-oAx9=(!)1{_8x&{+*iO}N50!hH zfYIchWwljnFSRh5Yk!`dvgCw2CsshTU@_B|bkHeQ^9AG#gCDzrQFbcm)sxMmLOr*R zf^zpMuqg~$jcbu9I?0nY6NW0v7zp@YwtTfW+5@1Au_UD)LBKkfHG#(w(MnF7H{Aw^ z8z-sFy~?e$pyXdX&S*#^!ayIKIK>f+W@6&QVg9||a!*mX>KJn}sVp~)r;?lwNQZ;8 zChBLt|1}^{76I@G0QwFa`bR_{>3l(>FZE`n;!72lka_FNrL4?x5_NN$c14~jdShu&Rm$xm8ZNm1)xyB zX+64j_QD$MB$+7FPuE^@>L#~LNVL<7n|nE1i{`C} zJ@7QOU=~Zq?t*KFtylHah)rkv6t0(&k8=()l*{)laBlxJjyaG#5sO9&SLxqT7X;@8 zOX`E;f$0=mD;v@zL!PW5dnRs!SD^^yNJa{>@~P9mUHaiL9CyQQu)yXtqZr)Uvq5uf zI&X?g`nV@|N!#;5tD$j;^(EpSOcp>BrzSlfTrSP;aF5n2^%Y4?9}FzxwQAW!>gsi; z{v4+fwdkbOo`LI>s=TKCF|arTQ%#TsLkUIu3riQVTMy9ifd%F?)h0oB52)NT4e~r@_u~ zmX;>JER4&wjOek=u0-zjI0C``+N_B4!`}v-U2}3(dlAe0Mkrrx`5O+sLBmytKFP>; zmFc7SAZzJRxzQSg#g*|^eajq)thlHj2_NP`6-d^ZkzlD!qvUpo=U2~7nGAL4S^)z~ zlJdfttCDfTnVXUmeg4E`GX#qWw97htUxwj~XwyR?g-&pP`g2t@+>#;ybOn|O$rE@a z+NFKe%GY|e(?K!0*)hNtu7NJ*%B!@b><$+LQ_Sba^@lJ>V=C#cfu+hv@ z@k#`pS<+KdLq8EBvqEjH+_;C^xWl9~M4Imw*D;Nu`}WC=p*{TvEyRqm_R6|ReEi>B zgsGoCI%R^s1WlFF!7pTl;9dwh%!jkwq}P~rsWfvH>9~lsoXjTZB48_EWM~bnE^fLX zwew4>v)vj?9PkX;b^LKWxV7%yjr~0z;tiS^z#nt(@lZ6JPTYKMMfN8ldnpF>W8MD5YO)K>}Vn~N< zBQm0$jMLE2+*g>S4;X)UB@7aaSID?!HVBFPE?Mpu>_Rscss(LcHfnHUznB{<4XX{3 zUx__9W~9XJL2rl90IY)iZtY(Fdw-Ep)=TkJ zXBtGPwHLk8(fGkr)1Or9l5w%sI(oHcdT9_|lh06HX+!McKi?7j?4%Y%sI&L;Vhi}e zQ{S&#Nn4`=ex;5ixA=X&tx$sgBg(CrZ;ZB&iu<6bw+Z28rzR_?Im_fK;$Sb?I!vp|5Sn z<23HUQ~(U-yG0GxyhCli*-oT0pmfVD_XmsWR7VyQX`A~W?614P0~w2Q_Ulqg_#b#Q zed5oeZpKU%no>cGWoFBS_kWWru-h}m)scSyKT7pTzRIGaS0y6CN~zspq_GXuks&2D zkC5W+t)#IPW}{PIC)Q2Im+8sp88I1a(yDc3#2S?9fTJ1>iGB@G{l@)DI~?HM)QwXY z%gd~qC8pspZYw)t9m4h(%!_5)@=@vn8-bK4dcD|kNH@-diu)^x6=G~w)ZyT)psm4% zPQnCmSe$(k*_p6UoPBV}8;|`k=v++W1))~37$o2EFiFI_SnwDkUn_7D&V6)P62nkh zB;V;UTAY1)$RgMM>N-u|2Gv@VrWf+t;gTC^LtYqdQ5|CZb$^b1WBmPosy~8MG-Vr= zKm?ej95bzz=};I9w1ojC8@gj)einEXMrsWw{=6InMSR+E;xSPtF($k%REH%4cv6&i zNq>efG%r;ue~m5vWiw1cuusvSyk}nh2Qx1qm`XCWOu!6&?T!?jF(PHjUT(DD4 zxI2mitO77r{#hHG{clt6Opv`#{3Cp1h!u|;uvSf8BA8)J>nd#+YM_^B2!`cd9kD2b zJj6{`mqxr+@*OiS+lcld=Xn^1i1QNUF_=qnLRVy%NS=8DM>r=s?p*XuGrMN0C-p^J zr8COXg`)Y2zKwFSvMRoa3ntu%2)LYx8S%(TD{nM-_eP=EBR)J*DGQ|+Saeia%*fcN z2yBVrA*J;67QDQve3h1cj;xdJ)D;l_5SEwYV*H&_8sg156a zDQ2+y?^ozoQbHpnLo8#D88$Seh|$@O27FZT+4^Z8%$`Y!t=)^!}Q_^Y!;+?{VJ zE$J7&suR(yzw4pv!A8{L2s3lV~=e^3XNMk{IY3 z5CMg4?~+;~QHO-#)X9rSwVCS7Cf6#yWtM6i(KbZ35N#PDUWVKW6Cp)tiwqOTlS%OJ zU?Uek)d!s&m)uj@ylv{);;v&V+Cl^}2F14-7x|Hg3Pd9%$2Ub13cZ~*=#eQ-YW$MGw4_7-k!5Z7VFE% z*?Z*Jy5r&`fu+Cooh;=rM)o>5!4r7~mDF8}DqJE-F8*e)VR+pw$-#paV}FU_@f**e(iMWtEMCu-4O9NZ1mXjvM1yp+hC$ZX5 zh8i(_Vs7#MAE_|+JR~C-zLn-rU{DYt(tLTpB$Cs{T812j3c?a=EJN}-g^H(b9-|b^ zF^jnywJo`sKJ;Y&(7WeVi3t^d(zFrN!3bWq z3`yPGu&UGv6+(VOzFrMj9YJkL6NKO*Ygm;KxRo6rE(~AP({dSvBqLm2vCzi&ELBl5 zQbd8Y0GB&w?t6=yr939*w_I&YXeufb+27=@>0dDT_<)eO$PrBh1jnOy4qW{jeHxpD zcMFu}aF`gbd$v5<#}Qz4Nn8}hcnx}xQvKW79<}_i=un(>WM!S46lh|E3ZJU02I@eH z^0E@-DNsmQ4)k>_(ywgUV6vmL$?hYtScw(NKXmXXKF=8xEJ7pQNz#oYh#y>DeBo27 z%Qn}!(I$uL)b#sHQs=X!zpUAn69ZyHk%T5Dbs*YvCHMg0iRCG!k+EWBK5QanoJg#} zhX=NDMTrq)r-^`hTv*hQMic)jZY{@f-O|w|QzV=2T&mqkoLoDPI&9>vfEBU(CavN8 zs2q0$zbC^EBUy6*PIQ(mg{>4@wL}N*tFd$Z`F?>T@i#1O2(9{XVO{P*pkG&G%}r3F zYH3i;zP(phqve~RMueFF_oDy!P1dTUb*VPwfU3r{=acJjE=%%8s9LVP*$~HxI!_4N zK3m>y0EtI^smmMGQr148?0oy(+d#_@prNfTk?qWSX%-7h_B16F7vp9H_oX52Gy?KC zgZ5E(Dbs;6Kc`lY)1~3d)f=N^Kh#nGZhG0JYx7fc;-Os*M_&CP_c&lV^+tfUQ}}~W zzHK>7%)xe9|NXUY`LJVQWcgvH60ZPAUhoDfMA{5vge=C9r! z$wD8x?S44all8Q8QHIo!RF~$0loT1t%27E;BM1mF!$+#gm$(F`@$xh7HExR^7o(Yh>3FaHVnOc4y8ITR=B=hvc_Oke!E;r)|5eh z{nP6qqM+ybHRbm|f^TW%Q?e=b4GjTn5hf-~q|ZTnV}rN8s*6V-9`B$ppYbkEmxtM{ z2&k-GnVzf|Cg9bV&+ZK>UEHnj{pW39*B+rSVAuDqVt1VI<>yfE7GW9t1!}-A^baC` zan`dJ8vKvDyE*Vlk|&zSUEmfWvKq$6Rmy_R0Pk$KWTa)JI+8y*gS1*{NOA9D>|$7) z)E-NDJMIKeoVT39Ixl-eI;X(A&_|7yQyzOX3}#`4lr5eWwA@T=OcD8xI0BH_Ar-oP z5uEyGw>P?U<_}|n^Fad*l8Zu~sC6-(R!E6muyO8)-%u$M7<|kv3(zMkfFH-9HBhkC z7%jbA6B(s1UyNVQ>lsHwj@vg5;4mb`Cz_L(6g_0rQFn% zfu$V@AmB^~Xlj5_qZmvY)M#kBYLY!Er>ev&yb6CW_Zmtsxu8y+{aAzAsdNfIHa1tE zxk!d#)V6P4?3y_QKh?f3)e z!OlbL*FG`d<>+^5MR7FG>Zg{!D#Q{>TuLnD^n}@@m+QDu-3#=?48Qzkwb2XPp_69G z9jH+TeOxi_@9jJ>@7+FV1mYQv%a~QR>~sEl;(S%r2O>LDOE2XOzwK%f%Oz#hJ22UK zv+LKog^8@Jc-FA+X1Diz|K8SJHyl?_3!YK%IH9o*)N5tF@V08{Yg|D-9y}U_@VOI( zTi@g_CqUr2`;BFgpR<(=Cnmg{FQtpT6kD<&d|c*Ygs@|*baMl=kCW@`<0g6s;B|9| zb8NO9C(qXC*e0Lm9y87G<@~xpkuywU7^*5m-INK5uN%i7cO~9>m`5h(8T!k4j-(-k>P&WDn^4ZJe6GhS{`#Vu6ZsU ze4Q5I!;Io1?-?H*iWWWm(wwB1-(0V4Sdd&4*JwzkE%a3j99tYw&JnGfN(XtkYaE{C zjq6B-qi>lQrgU*>^es~KZ!wPMYfAL|SmK+-K$O@YZh4?;)JrG1rbW6P=U;p{(8ILK z9$ll?hWIrIn4UQ$uGIvVUruSKIg_l(k_@p`D+WjqHB`3Z5;08sbR?QNjaG z29kewr|l6&b)+G6$z?FHV1mT>!Ns~^7*EOygv1Z@R-qnkC0+tn`$dcFaF=b%B1b^s z91J}9qngNTK+)ows$KP=bRm+@?L z4c$OYZtvqVQ3nJw8f}DTugcIK! zT^!uyuL} z8gx+=o#(Am;M&ff!VDmY;c?ji#dk5sbx#?`jeyH9BWcG+Tpf#6IiVy*#fI?LJ8d5g zdEp+2sU%rp9{(HTxAV`-Ra>74Cm7h_Y@X7rX$|*gFPn0psSIsnB6XLX%Rox>F&?YbQzZk$ zG^571x0~;-IaXB|p=`R$;l~^6P?NS5@Q({zT3vfOHCtR#xQ>z@EUMS81V86Qx*215 zTjA9y-4;e3v>2=e$iRk$9dWZmFdQYw=9z^&|vZ> z%65QUdI#;`*9d7*XXV~qdfG|0?bLr?BR8_dVO1_;#1p-mAdU*b)`;6f6rY-*nNQ(2 z6;>MjZwh!74x&VXFSEoy1vO4uk-4j&`t%*VeU=fFyHK>2>{jj3$c{}dJk>*K!-F;x ze)ZU)XrrR-U-d(%4a)&6Toe?tpw@cAr?H?JJ<0eoQ7kn1h(6ydik^&M8;)}&ScMj@ zriUG#!dl=U~m9%R7JtBez6Hxk?`Uw~nDTVfJs z-x96odiCL9{qDtRw#lxsfz_=SAVY`#)M~AD1m10NCxm%dhpTm!iv#J8<1W~%+rnnX zPEEO!()WW6=N)m{lo&z3?*FTdCcKw)W73qG(a?h}5$aXn@4`h4LwU7EN|0}x8Z?hP zTkVbWJKMzd)dD9?bck`chEoOmMbLM`Nx7%D7LCs2Q6{HRV|D?1iGX=?va2p+r5XUx)n_>=``jvn z!do9*Ga+@2F|@~nh1nCN-Sxw3ed+F?x5bC5@&#?ZOjkdI&^Gk;h2{8U!cQpfoh4)| zbj?Ctr$StL_$;E*7XESFJdf$Gu7){}DSY|vX#;Y(taVYJrTD0NzcGB7s%{R!HSKTv z_c{*TLdV|OA`W7g?Uy&4cm?QW2lcbibrByK8JVjlU~p^B&bjo;@cn%!K_5HFa3G|o zp3iuqxEIyTVe{CIBJ@sJgy6=N?Qi4#lMp@AROf9BU_*>CJoh_Ru4n1@)|3tqg(DMv z(U>ls+N(Bi8yh2w;$hQ=qda29rSj1?8h3=hfvC{)oW2fCIKOMMji&sHBnP=ud-$_Y zWf*c_ppz6 zJ&H))+I#QFfuL)GdeB>+^pl|3-NM{9(x3E~L9s1HgNcdJ2-Qj*?e)wJ-ztGleRbBx zhOf&@Fz0kzBVJ7*Sgo%s!psbS_AKb{QDIH!x~2;Qw4epq3gbjaWczd+K|(XTYO5mv zWKb7+(B9YFE2|nJtH_O>xEx|ZsI5am3EMF)X+n3gTbxWfFn;tr14|S`e`7jp7UwFTX18*3}@?pr&MJ9_959_2d-Df>*Rf(Mx1r`pBuWk zMaIe@x?CtuS7Mi^SNb-sV4N<3dJo* z0=1RtmC}_4=@WQctD-?fA%TZ)+eX{S+-xpdZ8(eZh$gh;+MXh-6T-~;)k@NpR=ij? zXWABSV0HRht-;0W2@sk$WfoP?VWsR2uGw0JSbMVZAV6chFAJ_+n2z7S-&iB4+Vu+! z0^91r2I!*qaHX?lHBcT2lNot!BBgBDod)kq8=VH6lbTKGe*H2ITKlU7v8fMSHsFi6 z`rVqvme)~${wD z0e#y_HmW8Xyp57|(}Gt9jC$2-Rb^#ia#lifr=aRV z=9XiA8#~yW8f*GaAT_dg5e6p&PaN(Yi{bfC{2k=B5+(@Mky&uU$1i;_3)? z@Rq}LA{QHYRmVhX2XDev*d(Z!W>8@li0kPWJDTm<$iVdW{zvxbzX=S@iCsG zreP@*p}}@Yy4ztzJ5TAIZrjmBJh&1zT>N4;^hc|lL2I-FO&fj*?a@MoloWslwo6E+Z3Zmz4w(F=js@Dwg_ z%yf9-!P|+EvLxYx*wz1Un8^V}QJ}{I7_y(c%S^{%+BI4zEaJ_7Ygu1MIUWVy32+=y z66V_>BXKaQjDw-5p?gJUZM|nBq$RKJvSjmd0d+s4R~Vd4-tZC(c6cM~Yxev$hHHl^ z1z-yKhjYG>(MaO)-II|hhtF+l9R8`JD~f8##ecH`K`yBTA)e9@Q?&&1ZXkYj^vNE% z#2PPt=W17QC4{};sDO_HSeVadKZ+(X3+oBq)9gpI0TItz>H#Kv1Qd*nmni*72g!-HDsaDwzqXIo{B_oH~ij6E2@cy_RzKjzs9smryaNpeV-*Y(f8N^ z_S$$U6k28T5>5=cuY>q;+Opci1~aSIo&=10h@sxhMTT@ldzi7qUs(EFRg{H-M4xyyOi1DH=y)m$UykY7HLJTVVFI?@@O(NEZo;1$2_Xs4o zm>uwdFT+?`ck$W?6#gNfQN%UIuWElf|JGq$#M{>UK%_G!g=Lc$g^5G5zV!n^VyRtp z1?#s#{!fU8U3;tIpBi2*O39UJ2951V$Cc~1orT|=sXdJ+=eqL2SZbM*ITR-W2 z{LOqM?GFAmqi!8|0aL+wVuX#A57KQS$2#%ZaoLFGf4h1HG4!d#R-5RA)PY3R5is;^ zvIk_4slOh`&{tge+JQ#m3Av@ZHS?B4J+?ZNIYH8}klKXY<+A;0C7c|HXIW7AiLIs{ z24Du7f*RvFx|JTK+rLWJXdl!j!g^Pi0sGp;t^rPgB6i(ijQei9o+cTotPrX@h0@I* zuQjR%tPPCmmd^CAa}6q8u1Rh#3s@Bi5bJRWz+uE}*+ckRAw9jh3o~0Gbp(qoUqjuV zbcuy|H3&Nl#Ln2{T~ zjIVB(TYMb$CUkg^JFdAPbZkYE0U*QGq)1j4US2OJLfLIO%Kxjo=0pFHa`q#35F!-&m(aIK@|C5w=bjkS{>o=xPw0DWFn2$M1 zH-;Ly=7rMa3Bs33E;SZF(arnfr9uq>6lb1D)d)-RhV5z!&-ZX^qgel+>Y zu^Xo%v`xi|2~4kf58pv|W9KwmA@GG}qwrxyZa5TvcwtD!7>v<>=y%Z)kPYJIzZndph6T59CD0{ z@)mr1)8~}Bv&4$0@m4va+!UD*W zHIa7mi#b;RJpA(c(1!4~n*lI0M8emlubra|@W+bmhR~Yvsz>kouG|7r$jXbqz(1gF z+$I&JJ5MxT$BmF6-M-0_sa%B&E=Xt&Kq2xC_jy{-^f`TLpj(DQj=4uaO)915 zt>bVhawRQ!Gzb3kqzay0QACfPb~>|T9#1R9abjWcT4J3}RnErc_j2A?Pto6b`+7k9 zIrf_0>i&!Sj+z={lQ$IF9v3OYevea_mUqt0#roXJ>b_nm-76=2?2ZUtXel4R4pG0N zEfW&8P&krHt+v|jifIL1xx3-|FUjY2ih-vsSU_|>3$6HLD0R@yJwF;!1YHEtrz z{%aTRVzVBDHamI+7@AdebYw6tUmR_375F2t+r+zxj2AShE80i-Z9~Xr z*rgK6briPo*mj0I&Y*IBH{S1|JUse-%Z695Rr082GTT$s8N&fH2=3^490C<4q>N2% zagG5Q%p92*er^sT{I&dry^UIUvnGe%G<8L0x~Tj^U=})e#Ef5Rv(jFnFW}nILZssQ zG&X)Sc0H+948E|=r+RBvrvz)CijbNr&I{B7CiPV zm9?8su8#>0Ct}^_Ck+x=QTaBm8tVkOFLh?+0c|gL&q zNle`6aD3;rrd=GE~beiZuA@i+<`)I(%;B(kF{nUynMhoKyN}jI_ zfC_rz1;;LCC(5P~@(n}56tG_HNo(bq+qbtqpIBFdSjk@cw-*~>%qOQAnLBz2HiH~+ z=pBb3h-v5jCY^6{{G8m})^;{){#+jouR@t95rWP3;xG6uL1%yaBAYE1Or1m^1MY$T z6fM8mcUtzkJwDq+Cq5@Q?i4bCN9p@TkvjBt^m=6K%A{W%6>_SU+>04o5wep(k@{LR zc#4u%qM)+c_sW|p->FcK_~lkVJFawI*)rWnauMli|}wfSC0(M%L={B$w*|ZZ=$51bNOlevs1t-Sp7H z0zoJ|%B3rAq18-W>9Eq6+pjTD0f&Hl@HCRu`fKV<;)gj)OR_;*#o;;&LU&`>@;`DH zMT!`>7h*X`lrZ-Opb=~74BN4j#?1uI5-Tc4`C4VnPXmQWBf~QnDHIs>%Opi-4}#h5 zTuQ?c+Ow}O{|ymK6zKR{mbcUX8(nL2rAa72+T~l)%ET2%c8ICt8&AQY{5PnK*Q#ys zG+%JNFOm_*(K8WR?QZbB;(}8@eU9nyXNTA9@s9dZ;X6-!L;KBOuzT7=(Lf5kB;00; z)>DV+m?|0as9s9|DEkk;VFBF*=#e{jIjn>sc%rsu1J$<1uj}vA?c)GHR&A~<1m>tt zx-3W@g{+9`mYS7p_?jD*4@yH#LLdAenOHMMuT3;t#1XI|CthRzP(cZhC_9w?iCm^i zzWdOVIIg486@o1Mw-AKF&|FferJExs57!+@Wm z>4lXzf0iI66iv=nIAa|L1uMTfkNS1@!Wo$N$=9WiwID#>=aj~Z$YtOCW@OdHxag!o zf-BvRlTxRHz*FLu>BFC!psKtRd_v;($~S6l+JlF!u_2ZrWOUfL(mVTAD={VV+)1}d z%zPrP!D`oJH8d=6U+r{)024?xTqFLn5-VU@Kdpa*f*;p$gT4c1p70Dx;@K(~c=r6OL$C}4ppE>qHM-c|+Y~RS>6Vb_cEwld=1Cpwd5HfAp*(?6+iFN}AilEoeUn142YZL2#CWtzoFee#g% zaX$}eHutN)iAn7wZo?`u90w|-R z5vm&aT^Rw)szD!tEPj`c9tiO^_(Uo~>=7#E$6tU)w95qmD?fXV3zM6q*verneBGX+ z)U?_(wi~u-A3qO6!5*T|`9>~b)X;CB3qSv`=%pIz5`s6`VdTz}na+cjM0M|!?LGdC z2eEGvv0BZ<<634?{MnDZSH^B(J25)yjzO7Zbw5+mepaYA;gF>#j~PZl?342*lU^EV z$g`;^uf&x;%==@L+{c2vLDPa~6a28iSPhgt-GZGq))a@=4_Jk0*&?&Xo{Y$) zy2$EsSy@}j<@R7 zK&u)yEEID%G!}2W&WO{_n$WdsMGSHW%z_${q=IBHO`dTQ0poh2yC(P&B0H$SWDE0{ zF4f(_YLlK(A9%T_tBX_vofJ8V&{F(WBU-jCmnsp$yaZd#OOX~WzcnAF##Oyk@#soG_)W|=2*2aM`=r} z(wNBw!FPRlAz5V$(K>WXvjzJ zpytwGEutTib6_HT8-#ZvINw$lFx%N@SXXj)Z)|<@E{;@O;C>z+Dzk1HG}qNQHt)Qw z`VoEG2`q4Y`keMEk{!?`+kwnEV>ph6CaDNrvEHK)reYU-t?J*riTRVY&Z_${m3q`8 z5MM)C@qL&tsW}k-icKT(NPsY_fnk!7D;mCe7Xm(tmJ&uqP)l;ecU^U?tPEG zItoh8>U_Er3TCNPO!gJxDm&(CmK2c%o5;W(bN_~CFY`l7(<^^aFBI0l+(LW*vNM>{ zxeRyTd>T=GCwur*J8S*#<+zPXsCQFgO&}-WGA0}eFUjJ;A2kO4qJbKOBMvnxjoBU# z`YwVF+i>sd3#VnApQ~Px<(rVt2I=Lp0&$in(WhA&)WV0N%oR~M;zWD z6v{D(5P8Eh@eL?3EK9vMUbKl@*~7d;|3PZ-x}dI<9r|PI_?T?OMv#zFU+B4+WB9Y& z2n(`36w=z!oPsl#6Vd{1Z>J>eUJEC}JiQ~Q#+o<=VXCe3V)Ux1h_fWBnYyC_B~LBT zg2}{54YDHKOfJ6EOQ-01k(rFJEuQpqvPrg|rL;dxx>bdfD-dwaqu70{95-q?_DR&w zd3S94hy48u8fyKXMMNpv@8Ii|)x@*6cxpjzLVYttxtSKeNV>0q>J#cXuwCrCG`^|$ z`)4fp0V&hX&Wmc$VvB?}}t@HPy}SScqO@PY~~Yz2WJ)pXku zc#YIEv%w5VnMj-y3mTFODxo^}UK1@WI@KIfeJeeC{tzQden#7RzDV3R-FAI<# zD%JRmh#Ng$KHczL4r&eyS=OCySC+S=Fn*1qvX4bhjtebn34>$sAKfQwvGYH~k{=ma z&{VER8(7e^#~b0(>FPD9@wb3;sDr4vp^&zZhET4D)qpf{0JUVKV>*7>4SZBg0o`_b zTgLwC7*V`Kt0MZBw6JfTw*}*aY{~~Q=0thY3vN1Y_^z2Er6js63eVa?nW%6RWw4y- zdbt#Yeud}OlHrICT}8Rzy3ugTtAxh;A2Yrw%zNoUxJ$_PPRD$UGx70Oj_QA^yzWUC zyWcX22(!f6TmFrRdJ%K{VvEAi)(%aSQ*Z=bg~p$Ehk)kTIx@(Aow)3mk!w>gIl-4; z!#5oz-ohN$Q@Q6LaX21?KX3+nOmGJrAy>((mBzaBtqY4vcE}23vkT{y2+sSwGZ#=A zghiO;0Ug1pg%W$Xi$|3SY}2CeZDgJ+7uQ z%YHluF;owJ3cB`AkxL-1UxETV@Z~N>{*Zf74%#$(5g<(G^$iU!W_mxANb6*pBX9a{ zAiByM=7#keY53JSGYuB{@ds>==Wl3%?~)Cz8EfDVL3vgmyGn&?887&0&YN?(zp+3( zo1QNAYVEOHg(_jmoxrFrD!NtYY^f1yi+6?1)B1$XhMkNkBw;nVY*`5Y$qHK2z$F;@ zL5SN`VfiV~Z0q&7iP>YlW+K)3#6)z5E%7~U1QBIU0rt$gZSoshvvT(bg)406j*%<|da@=1 zFtKmREj*L)p}|pU;7L*7k7rS>J}uG|C(mi*P?EM!noT*YfIr8L9)Mn7dC4ne=N2C9 zvznSGBGP5cxb!DD7O+9T9Zl%>WPX4|O3&TzWMh3|A6QPiPOVOBOZoKbk^iCWtD@p+ zf~^N~W@49yP2dBRNctO1B&j>#k+WDIzQIB}> zQZ96J(3Oqve(CS~lr<>Q#{7!CX<~`YX5@YSG-UdFTq1v`&`UgF$RktaB;J31pE5dW zBG14u5$wk$4Af<8t^QT`^^c*G6WiO-_R0u#lw;XBYyiu3?TrkpQGV8@8$wxJY$@sW z)gcF47Wwt|C*30s&f+|D92;m#KTrP&X#>!wZes9+R=G)KFrVz6IV^MkyviZjk2DLLvgD+8s2Y?Drm@N01`}uzC zlvSSDLFb8atm=M0fp`1ttk37)q^D6?m{@@!-16Q`yCdx%bj(7@@8+17CsM zdy>M*hLq@Pm#^c(-_3w#Fuz0vT)96=?Y_#luI~@9E}wW}zMM3Sr28NPDj`b`xyQJ1 z0alZGWx>i#f*|QN(obKN(vZZXjSp4hmTDuTOpzoRdOwK=JP8LEToItP`IQD79nOmI zbu{Fu>V}bX2nXd&A$<(1n_aIfIaKY*A;BKMnIeg{#QWQK6CbTu^OQTT>Xj&+Eekz2 zqmVew=cxW!mLGNID>qTvRUNn7rE^+329%5}cf53Fxr*!#C6oO5u=VVh^AYAG4-*>~ zb7kQ*Nk(6H>4HS5Q1%YQJj~Kgl)6MCkCNdyK!Z7U+|3?Ak_?f556-k^o{HCs1!KpA zY64YYNr^OFyp@qF9bQaKA)gKaFVeA&c>rHiQbYsvIadX1xQ!*9W_w2_n}k(exra<} z*b0)73;K3@<@2QFCQqbc3ClkiH+ zT#__Tw~t7Wmd@{8=)Vu2H(0k;ZRawCNwcU^vym}%w<;Dh6j5vB=(a zskZL{yUBVaiYYX`jKx)eA*KqLusuZiCMU|%lqi(i=-elI^A?W221&*At1a`5@q3tp zEx_K18PiPKPxj+5&Fj9%z_mcvRzm5d_d}@Gp zKh}cv8}zHt`TFK3#l%{_Eu9q07X3>$NB>DJ*!5ghx3oozQUB{8l9Qq@Q*WCa8;kQG zS#qk|Z^bj(V?x76nmyi)L{GJv!x9>fRRvrm6(RA`Tpm~@tZ4g&@S=j)YcWz%c3NUF z5WFm4`g%z#;Sp`fGyb>iy3e+3>r#2h_Z<H+>c!pdyHb2XJ##pX# zNZYD7O*2>P$Nld}SPgYL4|`z=GefgUe$Mc684re!+at4o9Xy5W+rs!$l z*wX=KWx8}`JPF_!3@G%wlIT)sfalIL)6A`aTCsG+@7c~7AziZ9^$wHz^>|jWz zzABGVCKa^mlMbpM)Y$}Mo)+JS z_P&4D2r*){#ItST#`+LQ~u2q60I-w+DySW_v7|lP9X}pn(7%?ophfsGyc#D z7;}SWt@)YAewER!<-(j;jmTgdGDN2eyBRm|D67}u=R2?4;@1IBZ2wGbTBkAQsW!$d z8Jn;t{qf+(Z{ohCWxqbw1ECBj#No9H{vW#zp{vVl$$DAl6BXwxxe`3987g66y}rwC zo-2E59H+`s9<^ul_m-PbYaSlN=x0q_sb0-}XEW1!8)Y?3B5UhrYqQI{W!||3bMz?D zGbmlUyGnJh^F?X?&C9%an@>2@%15a5LdvHI2x`iSx4iS4%TpBfry2444vq{3rY*Qj=7&df2XXe#kcP?vvG z^%tBiP)S03l?sRWsvG>!|GUT(GdJ?g6f>~HlPn73ptDUc*s1GR4^=;@dkh}s)^&$Y zum)SEF=nlUjXmbP@YFOFPU!D1cqS}Y^g6-fTJ^Pv&J8Tg;sr`1EaD}6KbgfF$Vr&R zRp#}ygNb&QwS!-VaK9)v`uO5emOeM=2G^fDhD&L4>?qVAVu~r^Q3^EuwZ`Q9S-~Ri zb8$L>M=9>&5fw|_k^u3(SvQ!+nm7t0rPU}3W6sGD&!n*(az=jlqRuR?K4rixUX4F# zh6xP;I0^#-uy!y6;3+B^pH9B0>Z1W{X7PE23YOkhdR^V%-aq`~ROM1{G*QY2k(zjv zm5m`%#WxXoQVh4D2~x#(K|xXsBj1ptl+E;sqpAff6qdgZ8D`0P4jER-%B;MFrUv73 zt>YwMVD6e@#Z$lkpreEY1Wmuy{<$3%6^#cUP#|6?Ef_JPOjbLnkpt*l^2`HNLA|%c z+RkyxqND7jzbZ)$F3xRB4K`-W9HfD5JwKzPTy?Z!2RetX<;luC_&Cy;%tg_s2A5~( zW(2z_)pG+wa-7p;wWD5S>2m(yR>+I%+ao6^A7Xz>_!k)o{~{v+5*c`OIluYyWEZKO z7rzvP1!>wiuZma-wHoq?m-E;0sNoGC%IJCTVbhMWr=PQY*Jt>?gp{SEuw@1H zqU*ul(KR2x+{5jB8gBVv@smN^*zgaVI~N}Tm3Oln-G41~P_PR;&35&_Z*lGUMKLmV zAZR!%ISfj$vGwaGe><6C?l<$?1h|K!Eo`bgIXRrypS=j*n)0`hTH={WS1 z>YdxhorUSzsd*Pw&s^%0Biz!YC~K1wx7gClOZhm`nJLltg^_c_nkL{IVcf2_6tNc! zwH$*pcV^Yy8F_9{JC{t}Ey+V!(1TP8xQkgnoW+U^~i4PD`tI>?ngYHg?OzlWU1iL@GnPoTL$X58iS_n5V z`l_0de=C)@j|f!zR;Xql9;oSgr}AYG+(Zq~<)Gj}>(_(@5yR)#2CRkxtOEjL!suWR zw3Mffg9UH*m2+*A2J zxT9SA!W@{yDZFUs+hN;~EATAdP@+V(B&j_*bg>S(y%mvRl=!kGkxicTa&Av$J6sWW zvC@Y#Ce*;?8TzEVhC9%>N=X*hHE@SJDM4&t5FT$G`cSuhT=E3T+kDUYq} zL78%@!*fGT4iC)~{e?tGozeM+yV_#beeotKIRG`Uv9GX-2gNQWvc&;^kr}t;fvSAD zbcFX%{P%FEE;jM-$3yYE|IP-)55?&sLz9{iYE`-W>v_OAwS@Eb0p8)uxEVRCM9pEv z1~r7GrvctF1Nse!XOy@Cw%CgjNo&&~C@H87+`RFJ)Bj2}LCzv?r$ff@QJEak&3mlF zzt{q9L7H{tJWn?6pRQyFpeeq@qUk$r2EpnRXpV3Z@YyD#W%V4$j;dQndH6(kEbY_M zOwe!xl`q8O#mH!6`dqO3ZFJQG!+Q!WmfBnUDcUVlc<6#eWiIBE=(K};JAj&|I&R6) z$Vw*3`+dhh*osmQ+avJ07C!BtJor1sv1>3n= z=axuH&s(%8O?bc9ZhJW`j4n4QWK9#p-^r*Bn?r4@S!=dFk0IOVM%&rimo_!> zVdXmyjAx^B)_bj?nl+VoZXwCrUQAmMDuSCoc<6n21KjFh?n*8Kds)Z|Fo_)l!L~B#>M>yNDLVrP$(15n;`Mh9T3X$E3wLmEmrQIV{|qP$Q9tgOOP`2Cajp3s4mH6bSd z!g99)2`^G)hmIhZ8pYznJ-o4SuL_fUZWW%K(V!tikeU zVgEUxGwwzJE}qZu^PK!ce^dF!8-9kx>XT!=Y!Hv`N!clo$)^o_vs*&HCln2pT``a zbA#+0pi3+MaX6*W{g1;X1%O#oGjJ109wG&wK&0gmY59Oc_a-`L`?vyN;h*`W)HPU1 z;-ytsbw_(g8X1UtV&vx5kWu`0aK`S&OJk4dMnAz*~?`p;a)aPv|!Pxw}orK5P6Ho8SXSE0A3s zf=0Kxd2=(+Ga^X8_Xr|0^?=A~n}O^<*Aze$AH>twU`gI6`XJba5X@ zjLnXr7#5Y0&FZ2Y1@S)l8?ytnoW_I$v|o{3^f@>Uf_{QBJ*dY48s00G0>TqU*{}kD z3Vsb1F?(16Eao}R3K99oZvG<-z74{4|27@S_&-7;oc>RQ0(!V1{=!zR_b7CCqhmEg zP~C271$KWJbAX1maKqk&3BRVh>M;kC4t+oYN+_=0h6AM8rNMz^_WLA7%+lENlTY%xvwQa!ST8Ok75>P>+ zLl?Y!Q2Id-^IE3vkoYtIimlwy&=E%w4FSkEHfP)cnxJg}A~klw-YkZJT!rq}XvxR` z;|mN)oj@oNMui+SAV%QrT(B`xBMI>NpxB&a<+RseLv{Z(kb?9RTGs|dgrtJH4Di26 z9R-PwpmBwNlbWtuSpi~GEpBU@Zj%CzhjPXLs@$~xKb0Yo;rIU|gP#9F?h>oGM+vaQ^9VGa&CUW_XTXa>X(&K)z~Vkc zEOey`Rh9*)>^q|em(@G~!0Iv-tA0rdl4BnJ$Npe0z`MFVoEqOt&eORunD->bHzwCl1ql?^Ua zHd!EIR9=V}D=!Nm0l@%`(5NTs53guXPU|CEQuPxMrD5?EHZ&4K8H&|CHVJ2EB)-Ww zq!(NQP$0xF6rRNw*wD`qNXhgTw;`0?J{iFCL7Wq>2NZ-aDH)dxZqrw*!#xAPwe40P zS6(Y9ip!AUKUyvrNFH;ywY*#)8%ZCoWyvK!Gk*|VPf1Wn&WrKE9-sRA_gW#%N@eMi zwKH)do~oDf!O6idApT!9Q*Org|Eig41W2-%WDLlO#*=enG?AtK>WObcxCu`Yr0^~T z#mtukokhM{lAU7lG@jrNS70SD%Qac(LSupmsjxn3S%=_>rR+`}v_PkliKm#?8c#!K zlgTe*=>#V3n4}O#l!~+Q&1i_m*wK!={|brJKatVHjciG4e9GyZufOEtuBT7=QLmAc zmhq)5>-!f4y}f2?TCdc7>FrYG@$vq-p3&3(n!?=$S&o>I-6448dPaO}3PVl8Z>Z0w zc&us`011laLLtdfdfgnsPiTJMlNNX)NSDX06ORPDLdyr6CeMN2|ZN6 zGnbG#vrn@5anVdTTh_dQSsBhrz8d8PYZ0_T4rMJk#sy7!xm(ntJ}G|Kqm{|OvN{2` z^i!S$;teYN1+2*ob2##!W<s@vHA$IaXL)|(Z4}zm3gK?$+~Wz zCSd$gW_vbwZ9H?;XPDE+a7<{ro$Ga|7|oS0eJ}z)<{7&PGb@zR5g|B>LaS2~mbMH0 zTV(~+fWgp$l}_Zc*(cJ{(SJzeNaX2KBW2$GqS^fC{n2VI4hV68FQ+ zi7LATn_|{q)84l`j=hXPzyA8(2{K;0ZKHbcWS);Zv`_X=C72W1ZxdG?SGc#G?&W>b z-jKqnPT6O8AGP-(O!SCFK>i|@QiN0J+KVRYd zXHt8Gvx_{T=qWSF9eX%=NnZ-b5qVs*OdIm8>~5PBk$U;&o8nzBt&+nJ z^P|y4J?4_52VI(fjQ(q~t5h`Oj1wJtX-zWmd&*ekXY~FsAPud@m_wVUV1cAm zhWfB#I8Ey9pRg5ztHiQTb zzVFg$D+VY4Z=;KiEwyFNLBRYJ^ktXL(vKXI`-k+kN%$fUNSG&jpTSCy0HrrVlt>|L z_#@dsA5G@-B}4j+yHI$tL5-5)Q5gdn+?MAu`FM~@muOU|EXH$?Cx0e0bbnHhHP&62 z%xY+!6ah`&8cu@#+)%Dj6AECVMTR;YVa=jo)KfAHSG!{rt$^lhu;*=lJ7Bh0MBT zN^S^=F43UYn%kQ!9~=6IvD$El5wAqrRO6TB&jx0Hh}GZa=C$&HCkCipd}u0I{-%i) z_ibViykaw=h}KWT=`?8l{ZMiwkr5Kf1d$Pxa{Bt$e4^i8W%oC{9^Dv`4{C|&>pw5CX4d2VKbAPm%LSDTWBD)6N$g}B7M7S{r*$NBYcmhnpS5- zFjQ!v>^H)9E?1W__qT81TZUES+g(s+w7kBMU*yjpu@kQ~<7s>}nREHqQc{F}IJQmJ zhqWJ}oL;j2q{UCrpAnv)LxQdmVh9JeMf@~W3z=WW;MwD?Aiw?2dzil5$2@qPLZ+)) zL~OqCP5Ulydju~0>u1kIEjB#Fff0jR7IJwq!Cidgtx0K!M_w%#?%NJPzimU#k!Nz_Dz0*&nVoFq>jJvqznnZ{TOpcZyj1k zlU(lKP3IKp`;~Y6^FaL81FF^fie=ll^O^>DZvCaW=~lA;E2YX-Yr0xfIx$}TUVjv| zPmzslm}c4&jTan|s2!_h9hU!J`5NY@R-GEf9e(ViBls}ISC}QDP_MW>GFkZ8*F?({YxuM(@QW3< zs92JvwaUymRO(;II_;n+(%9GSK)w=yi_v@w#g!JfzY(4CVbzpA4Y4i7eae?JhdHVJ z8%`*S&Iw9zyW?y@Tn;?o1qm*-D*n-o;yHu6O=kWP+mH`4+bcOmwUnwO$!Z76yB(#4v`PuRNtnoIFb|!yc;m zm;(#z{yR%G)`)rE3q^J-YwAVE9Qxra-JY@Sd+tc^@?#2$N2Y|&OPQcYw1qk~a*vo(N3sb?ddjZ%yBUQepJmeh&k8A3g%f*i$^-#aaIi`cGND;zMc(A>h>n%=OW3U zAf>K>Br%iXXRQ$F)EqyB&2YlVG{Rx61cBN2E)}=Q1S-Dhr=l)K2}0?c8ON`gr*gc% zph08v6v+vMM@`MMRBGcWw=20$ggL2?mr>98G(zLj-RDl@)kEW;v8QfZ5Y5XMDB$t= z;cSrj`?KIH#VWazGo0mm(FX1~r3AuT4x-sn=XnI^56at3j3nYBhUe3uz7^#wWt2sc zDglVYvYaN&zCK_#mGHy0PX`N@_2KOeLcLyrRf|*xor-VN6xlA$yEmBW(?<0)p}zBbVgEC0UMHf9Po> z_cC)&;j2OcKA-a4hKmG)+(ii!ATW&y?r5JxTT0~Bd2Y(q$N(CPh}8?@%Fk`LBclU_TJ10iKs={=3f$A=Sr=)ELWiI)p1+aHsD=nNaM zZA6P$eE(iiTdgvKSz$2jS`vR7KbcBf+otFN`PeEL2jislILo6{&0`PmL#I2IIsljb zkjZhq>kKX5J83w}w5zH^1tamYBqv)<5w5igS7S8!xi9`|X#s~q+dcEOcGFr%ijaLe z%h$kZ7i9Ck#AkyK)o2A3ZnX9La-V~9i`UZKUoE>es>1*<*3=v-A>1Cp8Hfvb)(9xY zv3aU;wvy~L5PQ8l))%6(v9yd&`%=5nD-vYYH9U7f6m1;tyHP3cDx)E678<@p=XfW$4&OJ0O2VZUZNRRce!NvIXRlOZ9sU{^i(;# z{MO`SD4^8DN|}1nUoSYob^3Y(lhWAY;YEn*yBM;_Ut5Tl3r6Szt6NNx1gIT$aBPXQ$Zd6@9HQTJKBtd>NB$+U_5kio6Qf&D&4 z&ls>;aeI)FCfMgzsS4=ch2({m`JVU{l|zFu>PxFSJ1@@W_JsyI;2R?9=`beEc+i z7u_`U?tAMdA#1$7d!AjcRkyYOC2@Qmp#IkArSL=)!cT?QB8dGAOPd%?yxkaY6q@Cu zG0Mi)2;gJrWgy!^o?C55{Y}(H8Hu5}3sl^TU&k@}{(C^IQX}34Dmmb+%}1$OyJ(Xz z5#N8vji;XUecRi{Klg07UIZ6wpw~bDVX$@hTU!E6?u71%MY|i??2BmS4|!!PUL87U zr;RFJmu#qKdbgQNUU=i4t_QI_y^@9SUpAN#n$?eHLkZ8@VOM@QfXkv=X`I-yb4dWm ze}dko9>Dxpsx<_D!pJE*4KtXKQWi7dQ?DWWj#=CLE_QkIG;BJx(M$Mwr?ErdTQk0Y zMQo;e=Wy4;~4r{%)2iw&>0VA4mx>pur-KhXQld@%fVDGLRma|O6DOhs)_NXsJ4-e?r%;>C6ZTDex@F6by zRv;mE^?YUPvlohIV;t7?Vu1;L_BX|7LCFfBynzu@lG@`3w3|+ zuXdVi4zn74*w-s^CwAgZZ@#d_Li3udGzJK~9;9GrzVM#`a&QQRVY-Lr!&Pd(4^g zJvGd0c42{AUhy3MUSqp7_s|TWdrlc+&B(E^Wfk(Y66&VDzVbMhqKkd@9>Kx^V7`7* zX*7_kKK{E$ZtYZUcDUyu)$P`~LGV+S?OhpxJNqRQ(6UsOK=q5*=?xR`1@tsH{l>s= z*vS?^08h)+?Qr$#AX;Y~PA=mF0B|*--FhK#+$$aHe7NHq_3Hax zL3%WblDm7}@57Z&{<`R?v-7e(Z`J z^ohXejjJgtHaI_)>g~(k?wZ8*HJg6t^b*QyoaZoe+0`ZLZoBuRqYrL7oBZoVB>7GE zn{xM==K#7V%`qa?)*P1uN>IyW+1v|jQsELUnp$m0=p2*Zv@3dLvypS%hcG3m_ENOu z39Uoy@WLu*HEd<{s#MHdSnc-?)88|0@e|pRT|G+Z_DI%*52b<WUubn!1TG;RXC|%P6=%el#3zjBBmPPUVFs>6$o=`!%3)8@VL9P)0L+fkdQCSLK(G zHEu}XqLR}7#H%GRU{+r!u~Q=0qrmrpqUoyay}(OZ?1O)lcTcWBdZOm@8XAtPOCB{F`47E%twEkQ z&pze2i!gbofE+QB^Q9>n>$W{yE_a7q4YbRKX-j@2Z@*gH@;`2(sj=163-=7sXW+4ax$YAd1YU)@_8*CsufGl4SH(6ieah~AME27MrWP5#7PQ|(gDyzRG>{%04KGJ| zF^x$&wpY|wNKT@P8ni`P4@~mg`;zzleY5ik z=;r=ei#@aId~v4~YxtX7llP~1TAjvS2R-+uQ#=3b8X0w57R?&@TAC!>HMSUqm(Tlh zoU-l-vR9`aZAGJ51a6J0~~cZP|z19@b}EcU0m!%8_xLVXEw$-# zfb`=h{WW&jA7=~xKR*V6uL(=4$1OA0WSM+|)N_*8`j*lT_hgrelljV;{0-9VI@oc($$J#!W+Kd_wPhmlUi*izJ{}L#i_veko516KS1_i z)<_t(l$%)_V&PMpm*|HWzMHwosRXn?9!gFXggz4b0fBjx6cSyJIyL&k7V9rR^Sb~r zB<+tLoG9G}8!sQT$U~Ul_VFJI5R4fdQ~P(Htjx%3Z+x%mYQ(4I7rzkZ)2k`uLPkQn*vEf-z@w~5bj{X`A8b9uS&9oPc7Xvu``Jh# zZOp8{xNK8JpRfHn-5IZvJ7uFvtc`hlnmiW5TzN4hSY+#*$ zB+L;ol>DzHDi3<-!y>o+g=*?PG4!^RLp9y`t8QHIhG` z@Dxzn;(gupVrmOK|3d}(zy==h&(gO0B_2cTsA^{Jf%Yq1-dKBaxk*5No`NWJmL#=UPD7I@OVfOC zskGTx?~!C+c(?cDN>&^(M~<{H{YH~0lNL{QX}MMQ-Q;kCTXCZ`KjZwX$Imdcs|qz# z+(ozqyH!EUY|8pK$2995bQu)P;XK9QZ!BWtMIV~`IhGq@@FiiOFRGdxzk*_&UhfR3 zhP$ev2scl?w?1H&M@1mOxz_nV%R%nd+Q+s*F&U0slL9>-v$vqc68!~` zX;dVi1cGr39sOzbHiD0thAy@0<}#ezU}f#)lx2l;^wq=Fr_mS_HH=AYgl$ z#MT-PL$_-(s}!2ub$dlr<}^Gkc4~4(RQ`t)!;i%kQLNn=Mlw_p5@8f*1)3Nq4=P~I zkOa*NimR>fGyQM~b1lU;GjW}a-DsG|7R;&sZ*aWte+h+bpWM-Iuki`H7h7=y$I=}J zDHAD%x<)|1dCM_&jp(5^_9-9k-tQcz`E9vmPQE=iF#;mIq3jE~w)^*LF|4hLt<#4opV2tDQ=o2dO$G^Gb@E~yZ5-6 z#M1;xl*o<%PUFEEvBRQoq32(p!4NVbCj{k3A@^P2%6zgVae38q2n{_JjeGlh=l z+uiZex@`D|nQ1%lq}d|N*;?0McA7tY^+u{@6!?Nv>#ub8DcQ*aG{){fE!oi@^>na5 z3=}?65@4e1FK_H$ABbaZwQX$CA@0_sYQtjlQC+ZqyKhqs)>g%M$owEUDMUsOzY!!H z%k5R)8rvR;#Ta&=FqOD`$$Fu*seTP`&%w`Xt^-J=@mu3HI5ZYIgQ*>0U;?60zYcnu zqZS=5v$rJ4q)L>+jNa^lDL2=hw?f<5p$59>aTX}e-{gpL7-w?0>9Y6FznU%1w0I*=N^YCX#W}1laDmuQb1jR1vnGWv9 z2ZGi%+eH7~ZQ_OhF>-o#=N5B7R6RG^hjEvYZ%$^>I38Vh*5V!31<4n|&ORRBh+zGw zF!MZrSKuWQwzj`KbA)2A?&y-s^aX`Yd#q*-JBOF#QE6Ydy(fo3dz(SeMEt5z-NoIq z8uAduDjmjGuAy4o5k))_--~Y9a5LxEY1qSHUYaZH^D-qvBgYn;!dI9>Sz&PLa0Q*N2A3IpCo zm(p&tT6K((d}8vBHR}>#sI*XC53FRw2Ey{tS z2Dpm~D*h7!xuDqkdnv&pAIP01RJH=B5H3sK5AO%yrEp}f0XliS>SCcSs@RdRHo@av zoLpzhRxkvTNpEm@&HdsB_dmahI?Zs8o#eFLc+*u-rB{&Zc5Gn1wA)`qU%jF~Mx14# z2@f3Jyfwk0d)R~k?b|oDdYg2suHHNzGk}p4(YM}Ik)f%`N*!>q!J!seX}>P@`F1~L z7DUtM>s2LGMT~0w#P$q=x1^SIQmguM;@=dEGh99+sKBfc6syCF>1GR({plkp#zu1( zZWl^2PBv7XC(4z7gF~I%%r70$y}8b@&_G?6N!L+O61JwLUidv>WQ)xSK080m=QoAa zdX~P2?iJ%(ioUwjy?GY{y9pbCJbDHNo>@N^`t61IAMS_~xS!mlMIWh#vs}opm6>%^ z8?%=Y!MW$YY!mn4(~?6R`>K(BhMx__dIo2qrXyjfFJo4r{3OP9zVm4rk5>ZhnR~UN z5=A){u9O5FE-s@ft{i+?u2zSF@QbJwpTe#3PEzTI#H466Jn z&i73($RMdOz@?mWmA!3tWE?O%)LlB?cwUd~e^+KE+sSoit>a!|l*RfzEg26|u#eL+ zB1^e->r6yhr9%%j^kt8sG8z&W$k;Nq8D?SQ;@GCv6n#uwckSc@w;v@Z$zCj_|FXy7 zviYrn^F`qj=WtgTBwuzHX(=br*Hs^lqsL5V(u-{2ki_)1e(zI?i8MI_TYg!aZzbsm z$C;E+U-S#TbBY~y;8Tq@3Nebs$ocTIW$YohzuFV6?;k* z5(`mv$`Z7;Hknsvzz;fBxmwh&nK3O1%9*lh*oDpRC_80K7UROoh&9$7*;mA>FtGUR zxv^v|Z-#tzdH4KUb`n4Yn|0kn9cKLYK$nrR${DnaH!@v)q$MF!0!@zT;#L=itHN(!beY*a+YWCY$_j1Vv-slHd$=Lm)LKjn+xn`IS zYgSfgu?WU$<=T!&2h-2leM2^OEN74 z{$ll4=3bxB#WH57*8e_ey9$**FHLD9sve+TXiaiv*nha#Gi$j}DwK|06+v-N|7&?p zskNfA7sTLAYSG2XT4@xhZv67Q(>6$`P3ld(fI4(gdgOi=s@?*PWvyvA&_BEJc=uWON>hvkeuIV}*Uua+L5(>VVlq9I^bM+Zj z3X)k7Pti0f1BD(Jf!*TXzf7sHZlX)F%|vkc-MOQOiQRqGy7+Rg3&WbalcUi!*@<@h z+DSZ(?7g+DYJUVFHToL$(PRscUnDE)era0`CmG` zo0|>SrIt<43vJ=-wym!xG~2Rx(RR#;Q%mY$yeO~PaH$`Etbyr6N87H_VOzOVf1$$E zqU~@UI?(=bJMWPWsy;AXdS0wAm*ANZPuhk^3j8D&8y1=_eRJMqLvTTd8Sl6@a*x56 z>W=X!YnES&#}~w8E6GH~gON=LEWvnJ6Wuvyt?MRlnRxnD^qe0wC|OBSi4ZMe>Wur; zR~+Xm-67uuoG`)hc{z1Ft$pt_nE5jshva_X-)tPC;n$u@d8kn|UCI$u@PaiU*<@O# z^^8|z>d#aLPCoF_lq~8!?vE7i7yP0u9xtiWc-?$Ow3yh^reHUoop>L@7l>;pCDQFq zpYd`1tkGU;?aVx3aC~#bXxv@N-Oattapt|!uI>H(FKxv5K$xFws}G;u!v4Kgt;TFo zVI?Qb@cDw>m!%>m-fmnn7fnI+%A20z{*E`MzP++fb8l zt}=PF+@F-4w&w%;k51p2Jc&DZH)|dH9{xOo9s9I`%U^g`9h%svF_Uuum$j|SFvoM0 zUxyLqH6%+(OVCb=e zf{WZ)i?oUg zsy0!nkA099kGk)vnTK`jG^aEI;}9b}{AaA|rzG1dcv?@vZ(yY;z0vQ-a&BsxUCZ_f zqVe&B-6!+7)L3O?v$|yu`F5;)C|xv2%bP!4mvYwmwmytD67N4H+##1O~a0R`&UWXG2|Z) z_nCiv^*bFex8-}RmSpmCGaFvqnGOjurDFJLq=s%o2o6<0fHKDnh-SUy}E_p}Uu+WAha;;vB!sT`fK+X(L&q+=?qOY^q^QObKT$ zt%`EZN0*&Qo9{N=gxA)x&7jX{rAbq&uow3x$S6N@YH!*u$*ZDb9hD!-i&UL_$$BVl zW0pQn>XHW_KuAfQQ@oc_#q<+y>t|wpo^_X86hV>vL7xiMJG4y}oX-G00b2V`LbLz&}NKT5%CcPn@aZl$OM< zDe}RsAUXeuSY2LjWMMmj&o+zMTbHiu)f|EFSpkk`NH$*RyvBYHyCXeC+i&Gc*I^c6X-RF+-d_Nq47VJlR21;M#m z=2J#OTN++;T%$mp-3vO?l%o7P+}YO6O})v~RVexQdF|q1r&D8p@4r1$illw<$qWCF zwR3*%Ea=jBZ08%>wr$(CIk6_TZQIGjw(U%8+nivtyKmM016%b}SKq4cQ@85gU%JmZ zp9kAYLAg5a<00t);x4=Tw~_?iVtK=3}{{mkOTYpbml$zBO6YtE?tDpT{M zgSKd_Gu=SZsKv%q<^;YYh=Y^uPytsPG(S)RyzI->uR#X2!UR1GWz z4VFZU@|FkpD|c!QwON8}X}v{7*kJS;3hlEwG&|icz?#8J? zmz07t>dzs}dwcHTt+8Sw zP`kC091J4Ky=Rr!1;ok{x0+#K-5{&!K*#Xz?m$j*woo;6#exD4sbe*&@ zkEZ(edmh9Mv96@xN=v>G;urs#5uSN)*jt74W?kvfz`@8JoGcX_g`EBscM{ST4lz5W z4XqGOpaDu72$p!D3$VwU1B6)5p?OipIToQH#Goce6Dt$8KfI~9~!(2EqTIOHr}d+#92Mw4vfeM>=+S^~5Qr@*w)83n!>CI3-; zx243C49QfJSkMHn8kr!`DlreKuO8Z?AH<+prX#vK3{|a>N9&j7D>uH2bgGWJkb8>R zP@UU2M9QcUO5hyX0kxR~N@Y|*Xz>;~BuqgOCrA*`ATxr?JXD}H+Rcor+!xdBEuHTm zP;UwEoES&v%lXiv))_L?zW>#!@Z~MiL~&>pROyN;LXns(x#-NNuZt{{iUJN`)k5o` zm6mbyf_O@tE72;1d23jvHrgqVlr>?yq|u;>@^kfVVTPqOs2{qcM=TN!p=J&?CJX@) zol2#zYMcB^q&Bh<=% zji3osTl)VS9|!N)wqAQyZYP9T4EB?&D*N^mr!N-_D3P~`hpG}v6Db{-p@!7S9PgJ* zt5OBN5NBh>t}@iCSLW)fVy;Bv(pj@6Loh}DT-a5U_jUjZIq{jY|9P8!jTY!WF-!J; zVmHk70r{7|CZp{#rPyoP;d98+%N7v1R{ppi6jlGmj6bdbiZkw!5>jnp4!NS=vSeOT zTWcGtL1!q3QZaued&7eArc=EVU#=vsTBG zG6Ao~rin96$wV7zK$-1?E2~y@Z-+}EP;TZ%8)^;|(i1lC+*UQ%Db?0$p=m&f1%{Cg z79)AQU5dG6ayPJUW@*sHS3PfLf}M-_FpG?%!fGtIk(gTV=zHYaL3Kc%`^vv5);PVC z{1tA$0Dh0&N6iaYMpa(ET>2BPo zdwzhmo)KL~Dmc~4;;je#?Mt~BV&SGY{(4i^vQJE@v9wp>$^1>B5tG}H$c&TnA- z_|m1<3*z8&YMfAQAGbw%3)L&kdcX+C>_~H+RbDD-KK*|3*5jwh--wHk&>Yj)l^4-ep=UG$ag_&*o{*CW*VGn}}NLG%+E)apI{ z|A=F`Icod=^fLdy^C$9lxA{(Xs@@;{OrGUCe#RedgRRhe{YUpp|Gk#uKRf;}#{b0A zxGa?DMyBpKo#)U>az#YhSl0O2gL1P)mQlR{~1STZL`!i54H4u*|a5vuhV4Dxm3^=whh5g`=< z5O@@?Z&}>;r8>xdHUJi-|OO>q0dD9raT7<7J=|;tK>mJTA4#kt+3SuOt5QCvM6q?XlF+f zy|Mf!hx_J&h=24$taQ#y!+D@zA9&4#6sdDCJs2f$W91qLYA<+g;1bZ~A@qQ*2d zY~28ATK&Vr?!Atf$m;J&?5SykH{RL#tWOt2{D{1NzK*yQe5SAI2khG|Z(-J0giOD1 z>P@ARi>7!o^1^(c4W?ki{ti8bPw|Nd;MkdV$o*SL%sUTKYK{di2+VQTE<&^K%R}Rf z5?C2MsRrQ(831YSqsZ&)u1b~A?`219zo&%J z_}lE}<;tXtV-x__CC2bFs6=@yGx6ky)ZZA{6CN3sLGm0-A0Cpoa#(8Jo@GmC^f{fd zPl&G#?8mXy=pJb!*uHUM@3+X}goH}W;NNkoU{rLVk&Q3b;}G@r@-uXsU}a^ek!pkM zkQPlJ;>yk1o1MAD-Yo8;C5N&Ab9ywTCse)S=HL)4LkVS1Dlkv0_nyGfueS$2&k2`P z-EB{{mh}As5VESVS`%+vV=ETXmF+Y>KqfrtK_vg8WwC+*h-lg7^6xIcM))2yTe zaum>*BGtn}w-&+#s|HhxIKn)^7}hdDM%Q@LJuB7!1-bdn0c+!(>TO&fI(C`bz~JK1 zaH=o3RqcoiX4S}#UV=1wWV8Tu$v;D$4du2X!~z9x=Z6RwqbhhF{J-k#Lve0byz$ab zA5In6k4=!#sY0)l>l%&-$&gE{MW7l`Y;q+`CK3}RksyGIkXZbM0S-s-!!LgeDOkbmt7^Zw^~ zE~c_jxmm<8s8&EV(W53@1Dh5X0Dt)n_r^F&0^FTw_ zQnXeM1T!q->}?SYGLhC+DYcZS$ouA!S$VdE`y$!~;o%$p9C0t=eU4(2h(S@25KM4o%%5XGYVO=fx?fRWiVUpR@KlX)DoC$|$w>2yy z5fuB@ze{_6YEi$z)U3sUh%TbbsB>^@xquBACU<&d+-urT2=bRx+?9KT-j61Oey`}zV ztwWe(p1$%EwQUdHkVwKf238j1P&Hb75m=dVeG?33UfWyw>uzRQ1x(?kvdc*UvF;Aahg3f$`;0WQKCC>f(lUR0#)L*AxYyMlj{b~(dOy^_Nif_S|h1!o1pkT{Q} zh9N>U0-Qd=0!ul8ez<$8M(a;3^FjDB)8PaV720fMH;Zo~w*!AxK_9t$ zZ6M88-%Iu;lgnB{`2MJw1R1P86jl%8>rnw=!G z;It}R0~|uO6#7L9du?*?5r%s`Mtm(nIAhs4ULd-$s!<5XP_kY#E!CuL1UyiG@o=x z1Kh!BS2dsvQaJ^NR#r0v+qR=p)$>T>g1CteQLRGoFi(0>bnCftg|kZEOv!V1*`}Da z+CWuY@#=b2!-HpJr|QL}^zyu-@=r0L2FpQ8*=r9-q7ZPZD_Q2#AMDu>l<5#_W(ZFdFOA(w(9F~H? zF=jv*XbQsvxd-g^ghl6CU~T1IJ?L)T)hB2?v9o7Ki`}*@RSN7}U21@Esp%bqt zYYuMB3zbT=d9-Vk>EapNG)qw@sZLRzM42_Rb!6Rv%BDiEL)}6X+C@zFyD^*~n3yPf z0zSsbb+VsoTpq0?U6ng;t%CWgxr#Jx#OAdxGx7eKMp%tf;RDYUex!fDp8mEu>AR^+ zbaf(`m?^1kEM*P4vHbB+VErIQCa;I{C@&xC=<-NZ>sX&~QQ4Dy20ctS09%8@ggMr*p9}e|8P2EMoObk^+qrF|UF1C4l-)@P4ypk8 zAx)RIz}Ce;&t!D8WG=-t%J?|G=?%>xEFx~S<1!a=bL zw#_{j$W(Woe~vG9^>RZs8nlY%GKxJ*#q?@x$JVuYdldfaOC(3Vlbui(GnuvIVMlaI zl83Ejsc(jqVfapJw+$71Q{=jw-;0H%wqBr;H92tiAsznJ6N3490?(clC}VWXumV2i zVPyrLm}U5{`Md&3!D0_TX4u;^uKvlGu%0>gGI@XbW{Ix~43K)wBBllQJK(@?BeL~~ zwK-@~SSFc)0c}9x9%K<4Lnw?V>0d86x&8VD!9A*H<8TM2ndpSh9#sD&%AF`pl<+1h zboXpXSNWj4GQu@%|AOxYm^WLiL|5Zdkhlze6||vQVC7(2{J^Ks(sJhm8A4l>)0*kh zc=k=Xf&G(DQ>+&nFr&><*x}7I5h$}8==NLwl2A+u<4Wd%nR{e6>1f7~g5z)+Lj}p# z3oTM%$y=B`l;Qiaq7@m$n<@iB=8maz(*%uc7V!cAVhbZ{z8VMe8@FdDutprDyp4O} z`W8yF$(Zepx3#qT?BmS1xL#Iu7pE<|hM7dJY8=mTvrKIEQfesObC36-)sy#4WrAPe zQI)JiESyGOn@U%l2z9ubm$}%QE^G$G$QLhA)nXu73Z4z{U$UJv)tudF_RzahGMP$- zc<>@Q*hreu6MWQ|dmOrPNMc`XP~{q=XF0gd6oJddvPw=T*3@5{Sa)zCw~@04+E#OS zi5jx51koP5)rvSj*nKgcU{(4Z81l?Xj>JPSm1GgBe$`h=sk&64Bc_$K5;e6Z%r_5W zYZ;;;SpzYLqfnxt$|6Y4u~Qw56nWQE&YGTK=1PPdBb;w#rV8s#u+ISX@45=LgY6!@ zq@=15J-<%%Y#p}Hg#|yzF)P2Vb~T3D=&Ab(85%|HBbbtUlqA$t!CqR_e6Q{W6U_jVnwcZ&r73d?J^o~Bwqz+q8n{wMaO)}0pX;aTl^(17VJx^O z`FdXE!dY*p3*kPeCchjTy&v5?N$R_DZoDU&UeM{7_(Zm)i;gyV37HJk3zd2S9?9lfEs#NJbCoss=7{b=AnD}`Z@HI zkv-tW?Z(ZK9<>czH0qVaJOKD=<101sznaK{BPHT3)>n}xIvHyEspIOk2J+D}i1l9G zk%_3II7>TFZ(AbyB#MrCC;G7-$+3K!O29-q^Wbw?!+4>>kFM5+AmHS&uDJtl&x45y+}CQ=ND_|lfjl0X6!Ou^`d^i(Lc^u4RoJy^C(mfZ#R1a-e!j|81_7>3 zoE}P<E33lSv&(wjdeJls%JsB zB;ZtYV5skcI>6z4Ih2pDHi#y$u5r`kcY#ghq)TK^+a%5~NhN1YrdO0rBZiS}P+U!* zKboymyxsJHAIn*??qIq*NAk>Y+FTf)d$ssV#a(JlOO8i?Iq)j*d2IM_g(x(p1pYm6 zh&yS>N}&>h3qz62_N^du*LV?UOAQIGkBKJ=LLi_hmDc^2KD9j$|wZA>x)L~!2CzFdtPN|9lpM>?<@~;cOUAg?K6Xp6I zs=#!U?%;_BdRI#^?ze07j7naAYIJA3wf(6VKC(dYz&tN;gOYCHt#Id<2GlGWk1+`w zDtS*}--ct_2k=7d5xE6-9vqlL$SO(ddo6SV&?$22gDoK0PKG-YGT?2SskuTPT^?E$ z@dPw+Q5m2BKBwuyjZyPwkt#w;IFrGPlF5yVPM{tgEe*j4_-}onm=R>bMGg|yQm!FN z3??(SzriNS(fvmg66$@VlLdxrBfPmoRBz~s@UcF04?i$!m7-W;#mbahr#XsQB9cFK z%oKNDu|qW$d^f7KQLy=*+(Bxp0)+vb1hO&JHTY1z)vF>UkWRo9EfP}_yK}9d3;t*$ zZ9`f~0b>ba#xhM(MLz~3=M~|W7D8z^AwIFnfeb0Z6yE?u^4s9B%ifclt;>{Xc(!1M zox0G;Qa>>X;?bwr*qAUrt2Rk*LT7s2>q0uk6BmByjstu3Rk zxrVsSoX$X!oWt2hxA6cz<}GF|;69sva+pPEOI(G2E>a9tB(f zx*%(Y0FFJqQ~yvt$%TiTl>;;}A6@LMVhP-zmsG5(9kUERCjY zNM{wKun>?Zz&A3Sle-J;cv(+|5kUdpqkVuErXl$(z|3XQ79Urt2~5iB&(+K~^2G8` zg7|30b|+L*Zkuroz66SxgD1soCDQM;PC_*ON;jUFh14M$$-exFmYA12<7l& zx!6q}#YzLkdGz)KrqJ;#{~%DoLPXume>FSmq(DDgpQqLZ_`ok$jqT9MDk=t4&TKT> zFxBgciXy;O3rLF)d58o9^%VtsuW=O&nTNdbOoFwWfM% z=DVj%IiQ4CQm>>mpQlbY@xj!2zX(?1j^#*hFni1-@tj=)6rWtlf0#+|#O?D~`#eId zA$!dSYkR$SDI6Ry@^IMaOEh^G8HKVX%pVL84TYZm1Fq*8-ssbG85>B!X>v^{l(|m|oTs|H(!g%|lQ|`QN)X;KHZY&C@VtjT#GDW1X|GANcZ4)UGJlpXRM4kSS=`Sy zfQT=T(a_&Y`$xNYm0hHh){TN!2744K8J*H?%QYG@?1rGLk>`*$R8g!&c5;(63XUuV zn@!BaP1okmk^~GHCNJD_{xXtSLi%FH(sAtKvcAO^z0pR^%+FISz19K%P#th9m=PtP zX%`*Fe+)+F#_eFVfV)iuXShUcL<($3BH2H_Ii(G&iyuI7qGTSICdx;t{NAs@xN1XQ zkhX13z|Wn6R%xYd@1i zPs^a6P|FyG1xkFRjX^`ca1oUr4lEQ4BS?V}Fg-v;@U8{q2QEI6Tbeaj_!~=Oj}8pR zP@RAL_Sl_@?z{zaQ&!BIY~jhEJ^-Fb_A5{FdN(#ZS|qDRu`DjLimOm(QEbPLfWc`` z))5({QqT4fObLd5CZDJttDVBFq_o`vwLFvSS&49rWi88?F_<`}gb*dXyu_r;6Ltib z_g0~A_Ol(iclWHXtpY#yvz=~d?Ii26^3V`RE&df(Y$#hK)8BZI-Z3HGyQNQ5)kYAWT9q+!qJRn!aHIunLpluy#*y4;*_cbURg`+xSBkC)7OpcQsG5xoA{D zk9S}_#_y}-<~wf3<5R%z5%&AO$e=wy;2@XygUd?jxBoGey9327(};v--#~A6;n`$6 zn_k;`FkwZ^55)^uxVWnYs|_{p!_Kpr#NCNCZ{Pmw@>AgR6%vePo%cHW3)|SEs|dtB zy*A)ENBiBmOMO3#)Kt>xp5i=}r2v_x%r$vj#F;`@3Dw|(1)~94UrZrb0on#vu8Z3W zPbO0xK2Va99`OnK+hykHR`uC%05$ar39W?%(*PzYdR#;~#G+63gseG@(6u)>YTr6? zz=1!#O?f)q3WflsDG>wSyQHD+!=8l?j?dSkc>FKX4bDqX_nxh!tU{<-UvHU+5JlR0}3yDO>YHsN5TY${UvVh+kTW00hAlJ#6n62Ff*A}4muc;3GuEX+q+|2q)NX>|-uvxTl)tL+enD%ZLRn@v(y`Zx zUZ7BEej-SpLc>-+@qZ}*G}kK{Iv2kzi~8`1cdjV@dU}yFLH8`4^$j9T{h(t+RWsdy zxuXN>S_Iufv*$#gu?=-CJahjpJxP`Cb+T2O3~|87gzS+g3@17|!)h9ePq@lKx7&V8 z9Yp9k_kzlJR4VZ>T1;zP4;GKY4fFjj;|p znS#cf+3b`?5o^b?lO67j>=)x>K_JZ1aWGvgwenkC(6o6sj)TreMCP@w?7G1%W!!0c^iQr&R&8KQjliYTDE&FsK!L2?4Yb~r^F}J zjp0sIdURo19{PvB>sN;*EsJGq^QeiQh_WfZPzJ|yI172~>~WI~tHhczDn#vEZ2g^m z&FU*Xtsm&wf)k~l=f1DQVozb?;DU>%RG{xmiBHRKX{O#gC9;qFPf*el)}L|$w+@t6nrau$L3OK z`6kKR{)F3{-!D&!i8HMZE7;45IKT*#Qdhr#4^`S4VK{0^l*843JQ**jUB2T z(St4)mK_IvK(pL@d@#!jZKIAjSjPGuKS7xI>ry6?hf|TY%T9b7<&1{9SZ{jGVyp}+jCOoR+^OGxm(;D|C>zxQJ-e;u!3#{w^xdd5ctFiV#EVZ$4 z{Pmd1fuqB*_7b^@O=2T8|8mgtmSCQAKeIVt*%xw>XZZb|3|+jyQAEM1e- zjNK*Xb^`NeyMtJOk@(n-ILoWg)9|(N*BS!S+FhUp)LAN7`WJ4r7Doh(sY{7 zX=e}XIJ4LoYf1@u0kMjNb!w$K{aUC;exTg8{L(>uLo84tt8=1ZwZ-lj zGf^=%Ah8Cvd;0;uld02=#YtxAw8Q-PPwCpV-uX#!qKygCz4VWRZ=UiNHxw9u|M7$g zPa8u)lzoOwZDsqCl*XMo(dBe*Q}8a(t~>0r_MFub4k7agVP@#0W&{{53#y}7(uDz) z0Q0Mz@EVO$aCn&>s$6m%alnE-40&iI9yK=^088N7RK$C?HnfcG9&y`RtZ3{^7VOHG zwFV8y+z#R%No)k@9?eJV51jOmO)&i>gFc8DM}3N7%M&eHqqrD9W!vdVnh+JHlQnJX z?2yXwV3i>NkgtqldS=L_>r1TWN|>n$q7xmQ$nS)9uL=@G`L3cEO|33J&eo=9@19(h zL{I>iIn7Dq#I!<^NQ1xCF8H9E%)w%nIzFDXqQ+oyB!#ihn)t_{^8L^Yw%hUr8C>G7 z^S3x(66q>kkhXQONWd|RQ;-=JDR7WVxm;-rNLx&zwP>T&+w<@J!o|YHmYjJdV0+13 z&?)iE1FDsreKgkTtSXD^g?kY(i=tDtR9wqPR#+0Gw&b!&~SBvk9(eEb%-`9twc;%Ku-8K8g=aYb_H(Bf{ z5*~M9->K4K-oMQJ!dNNo>D?Qu%c#0^!u{KlYYGKge(<#*+Mn)EHP_eI%z-O}h^T#- ziKx^&l@TXKx?ynC_jlCcpYu3%puamyTeGhlJPBw14jr*Oss*wc#-eFmJgzjaxdgum zhI7|s{(Jjd7AODo?>C7b>i5g;>A1(qc=$(~!q@utws+|Fnzks(XS(+)-?JOO@0Y_4 zBSCcTm0e8iO>e_*i_fb;o~*Jq4`zNo?6#R$zsGpNUt7N)i@Q;AcW`3F3H)d?PRMw; zdzR6L%G9C>ev+gh=}4zDMQEIjd)@X$^*3CRCpD|Cymh(_;VwbC(;xhR6Zfkly#w%^ z`tj}{iTA`5KOM!30-x1u+&-LM z9W8GT7i*`FYcpClt1r~GIq1&a%CKXBcBZUPXeY67M$Qk6xt-GoZ&A-A??-1rMH25{ z=147<2v~#qykA9wMy9yIaroEv{J2G(d2eM|FQ3y_jmKY>C%&dvn>oF05BrM}5=9L7 zJ9@vrDp-8JDty||V`Eoh-Q9aVN_#)LI35Xd@tYBDe%TSQ8StOCS?IjTyLBmi_BYDW zdIVegjWRyzO$v0stOeQszH!+8UGK)o%jyiFG`w=m*RRZL)0rM%lT}9fNFiy%mf3dEFZ{38Bqtx)-n(Ggb5m&Gyauyw z@BQ_kdk8}l-L-0A`9LF^4Tn_O#rphL!1LL4fH`Y)W{ZzY6TMgICNWob@1(p8j+9cl zq-*HCIOeME4@y_KUSS|}{15!0#P{)`33rFik&X8xS>wCkeWdmWl*0qWfCL757j9-` z)|fhn{cICPV#RN(+D;Z)D^B9I@x6;U}7TUF(a9fK2iJ9In+ETiDFyqy{ed~ z3^A(! zm6&IVCin;0rV^qFf{%JCU)zQ_x;v97AKNH`jmrZ@PYU%M3x*ydRu zcJXg!*a@NAgLy+7>{1j9jFQfc?I**`UD;MSzGZ8RDhYWm^Z-dnbABC2yOM5<9F?oal1$)G{R9(Vnx1UV<}3cC_6 zLE-<%-_RkCl+~?U{vlukvuOnYU@mQj0;fDbYPMHqWy(lb8-!O%OE|3TcwY!`TG^As zA6+ryUOU4><~vET&4IDo95E5q35ku}7$PJafsi*jqoHWR-*Qi8&NY*r3=)DSJ8{|5 zrxi}wK=diR0ynEo0!EPPQ3T339gqFSL#Tt0uiFs}0e(GwjmHw$j2g|d(4(5KxeGd9 zB>EvA5?umdPwGQ@WFdJB%FD9)2crlGQyZSAi&Op9$8l=c?&DcCI2IM}VcE?S{+NL! zAh(x9P3{Q6r0wzVV|gdnfCDV@`q6abO8)z5#>3FF2;`4myz>sCLY7^;w&b# zGeJjJro(8aRxXKaBRVh;My9B*si3JW4Mg~`xiFy#F(Db}R$FeMS%jih{=4W<{CNR= z(S@65eFC7sm}1BwE(@4YV`HHe`l9PmZ??42!feQYxZo6_uHlpBA)7bqdF!x}l%TZW z>ar7t<{HHfJ!y=XXKbU__$6n^iy~2{QYj?GX3Zr6mFZH}Qu=nun6V6QNPr?VFUe7NI;ct#;b93bs1>xmeQGB6Ud{fi5X8a9#&&0f04*cbCd83Ns` zA-QrVJVU^7qt{uT)8C@7lf?xzF3WO@q%HI$y>OhmBAbq4+U#LFW)GN~4<*vf5zqXof4 zd&K(#|5k~OnK)74@mYRY-h&NEz^E$h#=IEiQG**CGF&PKcPUg63Lm%J%oF2Hf>dj2 z9d;dY5v_|j{%=93nV^qxI9QimVHa*HpTHx%07fAo->JQBj5Z=lN0)b8wT(t&Ib&dO zS4{92-C-1_^}BfR32(ft9Si{K=qVW8u5mJ8Ma266f-JH&mq1B$z%Q2fEPAMltE7ca z5LJA@pp1}MZzhTsF(DX(5UwZ}D9ImjJFK%N7>XQ5Dt|H~jxCcIvyh~bCw;e54@+9? zeha_XLbObB-YAct>C09;m%uh;pupx%B$#(22niH9uxC2Ju*CyzML`f#A~1jol+4|q z8+sRinGB2S4Q~00sWMVt5BnbnI*y=Z5J5CMaf2^%IhFK-=>llH&od?!9?5On4Vg>w zrfg!Az!;{NUBs;+rf+tFq;kQ%)8>VFpK9{*1@w7I{ZYV2!3svQ=B?5~qcR&*LW2q^8nV(`yFz=Z-FIKe*$R$equMR|92WY_B%e#R_fUhu~hRa~IH znFwnB5Y98uosYA?haMu~A1_oNS`c`mQ!j~uJ({9kK~9Bmq)? zD^wSk{QRlFMhBVm2wj8VU=ilVxWvV*nUpi7+Ps;JG2LAg4_b1VtC~K)TE%S>)PK1s zU?~*FlqjVD#Y|j?WR{?BaT@BBwU0yRwypuU)*dEK=)7LB@VDA!0x(5hpP0x-;GaNH z5pK?(E^puiR#wE^w#6|Wpzz!p=ZHb+SHl<m`-W*zF6hYyc8aI=VqPda z4pK+Ie(LdgE*(j@p{Ls;$jxN8EQ4ALDAWL0<*2Q_He(_yqDia*SCHD^EwndUsCgMM z%(MJFZ3@!t+>dl*9VNjUDCwGaTvO~8GXGb`G5@?1;ZO>sx#P`bvQUr!6l;P$4n!QX zK*s76mqZg+ga_L&*rz2npne$Y(J3Ib>d?V4yTgB^TqJ5F0KrzLIYLZ~*E?uv7)XS) z7e|4FL|`sGWSC=1d4*slCe<DH7fYn?mG|(=bf5 zpXM6gTNZ2>+S$Z1p5ZtD!+#W0*NVrr`To*}0t(nCimoye**}#{JLqkI@OcXKDNx!? ze{6@L3e<Wd`I-R=>BI1N>jb=l$CPe< zV4=_oc{c2S1vUALM1D-UoeAf!1eq1D&MP9oW6h!aB1}HWApfwP zm@_-^+3bP~IzH66vlA?+!2xMt6doZ~nwC)E^Rr-Fqx55|p}J8*mf(NJU^Qu&ac@0? zU)JO2$J=(pF}VYUJAk5XWFo|2lQzBcQ^Vlxe?XE|ZEgKAN~D(YO4ys!VjyaaCP6r5 zLw(Y^I>gD?<1J97eYGSeWr9_cc{c+luVh2J>@>M-DngIo^WfsE`xfv1@x31NwIw_K znVaciH98z^e6VuRmAN_+!OF9AD+Y$ZmN3c6M+QvaTm5SY-{^r}lsj`cRPHZa5 zzxz0lgLG;fa)_W7C(h8&{B@g|l(6bBH{VS$c}l2oP2_CGH{E) z`9=ZoYZX4BAOpyRr-N|lCVTkEetC%G^tMW->E1O)Nzj8+HLUvV46W+}673xs^Uxz- z#);*r0QeK9Nh@eh|2z!Ud9C;8=2yTb~?g3YfowiRC))a95 z;qH}P2>Op4#Ne|ML~ldSFEmK7gN{Y6o{mtr-I+eR5jwqrw|t=R1Y#K4AByZQ1ViIn zl}7MY`&ej1xWQHUc(pXFl|yGLK>7{L)Bz{W;gWc6V%X9g-@y=jKb8KlJ@VAIUX+$@aQAO!Wxx;8)^Xgsi6`yP^S^8#0pA)6nirl9Jc$K)@AR7IB27hRFQ%( zIfK%3SvaeoP6rG}2q_vzuAQ3LTIv`I9MA3EficAy2OV*brz{Y&?M)i4s4zfX;FlKY zfL39@67nvPhdWhZ>w~x;VRjOK?_lT#MC-4JCw%X(p@LBkTR&A&Bd3cr*`J=2lxE;r z-qxt`Cc`(!s?3B-redQpb5R!PXMcs5ne~hc7 zr;>sX7DWhjem|Y7WVzp}?bazNw)g&3qNsTQpp>|Ov|_)mBTWv}p9V&%FJqX^i>!pBcZFu_*6FI!ZYeX<9JKAGHPsb`e3I|9~aDyXt zp1nI`2+&&zc|ZJe4GN|iA}`}xPMK(@xuHO%y%x@id-KAaaNV<4`~-&p77rY!#cYS# zIlRZj7kmTo1Wck0lNYd&nn^MJ_-2R2EY#btaXWkY1Rj6nx;D90R)54*edAxe!mK4+ zP^M9rrGjPlkGOL@5>j`3U;|a`Dg>$H4GOHX`N}QE4$zd;sU2|oGtoV2yC+`}lw$D=mkl^9OQ;a?sQ7s4yIk;6qEW}#thjp(v? zEH`T&+S(iTCbpzMME@%t(2du|Q$L1XP!i~^lP=Hg9!m*V|hEcGnM@TOHpc*iJS2gP*?1tbQ42aDH$ z0Rw~YKxK*lw(w6nrrx(s+4zDn-e7)K7im*^2mv!psDT#-lEtJigw$nUdl8DApB-Y{ z$By4s^;u~I$Wg|B47+c(8=`fh5Mw-}XfDTDg%(DvtpQ{T(03aU%L}fna+&~wNnDqEZEWb%=p7!!`p8>5#ugU!VyMKAAJ)Igzb70ZM-JLISYI< zNopCrCuj~ySr_~i2*2Ix@1`0@q;oux%mps&lAAu*Y^tf(M8FOFgQFQu$i$o z6QeVEr16>Vq>1MG$9G4}gqx$$NR_Wp?H$?O2FD<$rJ{${X~{uQ;AQn0t!>KVN!#(T zCpjU69Kw8Q2+w1&B=sW#G9;Mq2l$AT@M_{U+Ss%}R0ZWI9k+Ag`kZDGPUibwm{G4c z*dz9AsNj6y?4{8AQJ7lMe}H{E&P0iqSKf69F^3e~pHKfwng{Ic)=Y z725~k2ghO~t&s2=hh2$8Zo^N=4O@;9m?Ulo0n(>t1xQ@&cNmRdyu(pI7p-kiX?7+M z_<;jdtzQF#sORft4g!pApBNA>n{&?!hSooOF{d&K71QOip)LcN$juGe*HgRN>U#c1zQM_y7Ywbi@camBz!LhCUg>oZWuyej=Fwjanf3h3H*Um z&6a~<1O34JuyMO?^0CYrT1M^A3W~G|F-citJdd&Qi({9_%P}EUP*CB*B@azU3Dy|W zd`UqN|3OCa{TH5`0C_d?)@x#qFj%C*3{5*QrBiuG=Nru618y~U<_GjcUwC>=;|FFg*TK~!RP`o@%XT@5UX;#u@*60#W zr0Nt<6-fOdbgq+?bB-K@Susb9If2LX_0f8{fy(!h=xo9Aw`#u=aI};N z)jZf6GoY{%1^QOw4F66}*UIb4c+{l{DNBg}&&fm|%lEeuHfF46b~@h%ld-EB=(sqF z?Ov052A;%ycoW)Jq=)X-wqkUr<A>TTUL31Ugk7ZS6b7_7#|Q?r9C?urxz%P; z54Gr~fUTIT^&agiUMXuQI2Z##PaW=AnxobMg@9; zcwp^tt91s$N&P2$X0LB>oQM~rHmxbDsXI?214}FOOQ!?osEm@&(0{bL;ZGZXt-N#bS6)BzdzEe@5*Ahi8$)^ z=89p=lJby8fIP-enA4fsC5TH%j}+>R@M}*od6KwZf{u4Pggo#p|1==_WGn9VaTkq# z9ml$la8scr%(L$gi-Br^*el^x^X4JOpCoF0mYadeGzkW(MZWG9vaceF4l|BO%YLO{^9 zUZ$lnCXrcb`tp{0_qH{gmoc(R-YZZRvq{cI5X&xb@r#=w`%EP9!jxvj->s*yy}S47 zn#-h9%C}oaCDL~B9>d0_EXzGN%i`*!I924mSEOToy}j2Vt_Je!fx%4*BJV0*y|5-T zYhJ}~5%-`0FY&(u2qpL0REFlIxl79*-kpvf>{@$zvPrveiA=k0spzoDz=~?ccQY5!_Hn+^dWH)+FT6smfIw14BJ8$my&(6d$r{(p3&d$d}i)HJc;wbtPNguqtcMd-b zUrjfk-9J3tKOP-!wjb>re)`n4pP9Jcp0)XG>lo9=vxnj4-NoMFZf|$=YA$XKbDA8e#POc6)x8>dM^moqghu&HDsdfA0vqzsFwVHcG7Sz{jDdX-3R*N zou@&5=*pw$e9 zUgs1GtW)0(?oIkncb^Tz??fYwwKU>(Z9z5v|dadoJ_TcO|G@eX5cRSI+-TukY zJa{yn_BPMDo9!$KW?{uDRjZe2)(|zOdLhss#TSxte zr}w>w*6iUI&Cj1Mj!t%7-r0V>H`uf8J~?pr9~!&&M=!oOJUgBq4i9#Yk-2$$|K9xe z=`;$WwTFYxhyBrBxBcRNyW2e&_3j%lAAYtyoKB}vZ}`-B@MwE&HhB>ouf3WD+qZjn zy3y96f9LLK>#6_6@L{X9dD4qoTQ6GAd)o)m)fZC_pFQ0?8tMlVyZ|qEpY|U1 zTF$2j)59&J`=DjxCVXS_XzihUd;Iux>uxJJy?gicLGRAfmk*ozQ(U$C&^kChvh}@b z@4^#TQJsoa7J>BcCJ%8!EI@s5H?)>zT=Re))9S_G(pKYG(n9bW}^UjlI)G<53 zAndL6Ea&8Q|IQc3)9~)Bxnp$w?cwd`tzK}l^YFp*Zf|BiJ8bq|4v(8BYxAbpoHzHL zJ}~c0P9`U_p>Y(P9ye!OYo8y5v$kOlHrMv{+OGMyyuT!_FnGo?LIS~*+<7O2YBABFO2BX#Iv?{Lwv>R zOxiD}&Cb!_UhvWn_geGA&s)}K=4W@eCR@$uMKl>bFx^+jdk+@}U*Ox@@nC-%-P^^& zXVbLW!Tm3`AFLfYNB+oawRi31O~dhh;O3q1%AM{{S?-aBv}-RWAr)^z6Hes=aCXuIwE`-3mq?yIL( z*tPFI-9Oy4=EkRU^n5&gaohgX{;c^~@9@F?7YB=HpKi_14mx)pExdazasqGB^Wzyl z#tvTGxwqKg{Pc^%ZTIp1+2O&R$#di!Z*E2VTMK$Ze*AIvCYX`k&+C&gc10%=7!O)Y z(*`6N8NgB|k~N#nG@WIf)>Feu{HK5R_*BVQy1To zYB&D*m%jf$e&hB3{LwGa)RRY#ajy~nob;C3q_UAP)` zt<%N?)!hIgQeN8(+=);Aw!GSrJ2{$9aW{YV{-1vQ12P`kJnoGC8e({&-*Jax0?p3s zESIa2nv|Rd#GWp|7fEVjlD%0GHP@6~0@!7;OERrz?pX#))3e^_U>RG>0l1UVIZG&% zuN<5UIZoM)g(f*=xaM1ldsAcq;b_-0ro@-*=vPm+LTJC$CSvg54nQJWx zJOr#iTRfvp^1|n~a|UTnM;pmNNn*uJ^4L6u=5zyQlDUhuK(b4z8>Jb4I+yRPLU&Bn($E*`gJ-@b{&7zxalBdUAC#i6?>g@@fjjQ<871fN|lzO`}YIJ5%SA^`RSJ zGNNX)=R)FRUHb`lLJY_7FmrXtv$b4>ZMA}0S|eVDb5)LTmU4)%3ri@@c6V%W&`EPF z$AsL}GilQ6{EO{d7S)VzuGiQG* zkH1U-`Oz#XZ!RfsEh%p=DeuVT=TeSxc8rnK@{06T+0n8j?`(DRqg_(oTvFazQr=!t z-jU1Y6q7xOZc82B*>Nvh^GeXoO3KUR`$!RmKRvEpXlpSUjCBKNq})*EbTm-an{UFgj!Yv1w~Lw zEJ8GQ{CVytGqD0R5+}hsU*GXGCrXPqGEHsB%PPEe#_5qZmRwIs^G@1474b^Uy&&ET zb@3fVAS`}gpi9vzyn>|7sU@ePI%>)30-`;3-zE=Oo;3^6I{$&AOhn~)x@EaZNZgp* z#OQ-Am8z+#fM2YIFUJVYNPsC27cCkuQz0-or>3gUmw<@p{?DTRarD)buO^5Jq+5TuF zhe|LSSU2?={nOA}w=$WVn=`OC_#s`4Jm#S|^#UWGIzekAeQ4I>cvuqq+y#w%oj7Cg^91}l1HT5)*U+HjsXYPM|% z=omx<#*VjUbq%NOK&{OjxT;aGy!bFJnn9Q{f|wp{R8SfQR$-~4Zn6)YVO!51v6Nil z72y>Pr-^z7RMB-f%%E*r1~`YV3mk|s_(tLJC{K*M^vi@hIw~)z({EZv7leVg`j`G6V6d5Ue2C7vg;rS$Hvnb0G^o9f=@!wt&}BPEMwtllMd^ z9=cX2u#>b7YDC3*C+BLNPQgV})@z$ty|$hmDZq1Jd}mY+E5tPhkzR<}Y5%e6y+z0j z?!g)ig2MI*fcR>Or`J(6HZE>z9GvszO>d7>e+=IO$;`@E4OPcWXNk@ccwgO+#?~Q! zL`DX119>r(OBXCzw_pW?C?f=JF-jCl&=0?|2)dzClPs0tGoiNPL@dQnZX2FS$>4;V znIvb9c6TudT<1nDJ%m=WI!Ub-Qo|GB0TmuRSDqlt(W2trA%g-3`fiW>Q7(4+9rM}Z z36nrYwj5^^S9O6$IxXKz4mx?FC&GcMj|L)!9)%6ZAm{NJU=n`HxQbb@9UI5iGK6Cg zNs%s_!^;hl(};Qzs|ddlqL*_LsDijbl4y~|y+iE*VA)2~S*0gq>BUU@)54Qc=`m!0 zi^j1W6lz=^PYLYFh|8m&fiA>ImAB3*sBWfA5idM6{SC0+rsmXn1a-7tlNScN^aX z8vYDl1!wbVDteKc)<|mEil$OaR&*j^;vl=$II#i=XqYq_Am@S)hR#L}|KpR4>satT zC*!D*E^8Fy+;vDCb|*XRjx_9!?C-{>d%fO;?=^@dKAq#sci|J1=Qa+E8u`0P|8CR2yY%nABr;OVEv0lI z;(Hl6iP}_h_3d;8XNqR%Z zpDJP_S3XzXo|(AbQj#jDQc?K^RvOVKSToy{emu#h(>lU{cA%qCz7w5L&b#UCzcrA3A!3xW11*UdWkb{ZPfj8aAkll zu_~Y7{dD=YiCZ}rbRyXmDkivsDHkTU{4li!|EWHRrm-nd?Q)Z3uqCHh1tl$}0`9fK+$tTl#Kb)-ox+3?fQR~L&eCCZ3rdrle`<`Q@=Xen+> zUyl$#Xpcm86lTMpdW(SQz{N@My@3@-E(fd5`zmXnYk)n+(#JLF)mvxeE8g20&Afdu zyzM38(yJTDWgbv3#(^+U5)BE4$9cypnHuC%Z3S*0+n>G?8*|MD& z8(=qWfPN_M%Y7(NECR(+5?y7>kmTL$8Ts$W;X~q6Z#j!Q80|(BIWwfl;c#AL4T|Sz z7g-^ilPBIcn>$r{x8B-Y)i#~gc@Ho}@_McL7z2STszq+9^#`iD5rFeb=}Zj4A;JK8 zp5$tQo%8x)$A){&3V?O5H*5|G>PCkD@oMP|poDkCANVy%PJFOD z(w==IpFarc+dfN~+v-26!JZl?iR{+Zsx_pKzU8d zREFdhbX1iw0SwW{<7qZ$z@vBXU7UzY!!q!QH-qv zXooRe{8R$Wn71fX^`K4J0E(M2hQ`9)?V`Q=>1gdp3vpWT9y{ek;L6x}4(;bxe0d51 zdBwMD$6jN#Jz}Sjef-@aOP}KK`qw{yhikn4#j^d{rFW105%Rvg|0ikxVeMSJ+t9{1 zBh34>dV|S+j=2~!n6N_X4piZ|C#goT_-jgE!qcwJWFl6`Yv0$r!xYhD?5P?gZ_prl z#z8`FUU6bG$?ID1NO^?cE1SP+s-!$BUYT~v4&g?O>=L`;(+61^-p>7n&-WR-)!PxC zUdBoUBJ>lV3$iph$==1diUo8ZfWaN2Jz{x$q3m*oTRkSxi{+MI9&A2PbnR})KTv}U zDtNW`={-G}RgS=d?;2_WI9wrnf~T#rkjT+gSxPEkO_lXY)X}I_Jcmybp(WSjY4K!Q zXir_o@&#ui;-HF^AFktYT98+J_ux8mG%LwkQ&caoA3G_{s?w~CWkKahRnF;>cZnw! zd$^cQM55@mM4C2PgnP$1(kr3VWk-c>mgT<1yDQBBO`|L3KHmjNqAmb| zk<$`qw)|0;7X$(cpJ@xior^Gna2G@Rsw4Vf`SuxY{5jb+u!0lBPa5H46>*V7aw;@m z$(A%1VxT%BK-{35Ge(c8t}s33g*^Z!WJQRcqCbK?dgKG0cs``+XqN&DE&U&Z`GF;5Gn>#a39dYQl?#(b{38 znH396zf;Rutl^Q35cn5+P%MYxjOR9fDf zGy#gp>st*SDYGaTSb4&+;cjvF@$Rm))U5d+IqTasI`5$ACIk+F{-!0;Dp-;87pA*H zR}d_MQP`=)_%wbzwgKuOk|U+HQ))~n$XTt9~3?=l1_}JGs@TkvKv5X%v8hS z6NdfHzrzZN!6eL(j9T1N!<2x*f!`zF0PXgNOo z^Z+r}a6R!$`2jhxrrfxJn{Ie{2c4+?zJ`p?@#D7*{nujdO4zI3dWedzQM4DD@iTpc zA21>Lc#|LXX;1HQjJAK{j)@;^oCz1~B8#xEnv>KBh#)VX3DKM&VjDfScW`D=Axhdv zC3X`jqv@S5&zny3AkAX<;w-*gco)VQiJK{tJ;R<{m6F|A-JA6Nxv}Z=GLN_tfLjY^ zX2awVMoBXE%a+el43j`2NT6`s!u5}$uZAx;6nGK~B+3LmNTQ&@|F_V{r^kY*pz5m6 zituEJ^sj4_A^vIMdu4bL5|n3fhU-Ky2kZtBqwH>_ob5QK?=!Q>o%X7o|J)O^JL6Ki z5@3M*FZ%-^8?2&@+q9#Ql;UGe^?}M=?WJ~C)3?4M+`sbRysG1u zPf7ZK7(TC2#*CZW+2?KBTUE|@k~ObwJ4xB>)r{9Z_+p_B=HxG&`L|?;wx1!f$IHMo zQr}uJ=LkB@C|rbrahDDX^u=YaDk?9qw%BRA@9zprr`%ETCbOTO43w!yE%}t)-$p0!TVV^A4%nRZgV}p=?~vPCl@0&iOjC zwXEn&Nr|eu?n9}S*V1|xdQjn~Vt=3WGe*#3dY$HFet=8^***CZ>M|p0`&x0CcZ*sr zFWr@Q>G}SpW6v-6`+;~>E|;)lE<5?-0yWpwLQ*$&>lw~OA}KC79Hj~TOF(;k38FN*M?H-a!Gh=dJ)sB>=>Hk>ij~teMFIRq!XYGP7Tgy{0e=Gw_p%=> zY*8W)7|h8Wkb*}`;nFf$PO<=O&!opG0^^44>7h-Hs&|@0{T2SK~ z;;qX7otDb|K2)^P>W4v`e6yITuRs{`BHoHP^mXKusM*962KnP3Unsuce`S^V?3XimE9nLz9jPM~r3xpIH?L1tGxBYs=ntuHU8T2M&RBK*3F1Q%4xe^eM$Xy{v#kW0@R4 z)|_wMTG;|bA$822lHF&b&eE+-5{^w5V73?t;t8W!55M{Fn{b4#%S?b-1wYtcz}$FMg>5h zOhTT#kS6P#{T$@L*UrXP>XAzB?GtyJUDNpnT{oeY_7`rNV;h6J@Gseaj=jE^WQee4 zV4^X=uupI9bJ5PHuZk*!z(O(ZXOfY}Q3Vr?JPEU4C#Si$@;+@0Cd}bodIi$tt9kO&AZcnK;|F!oC1j7(E8Zq|kYO zD~f4+i%7mp|Bia$V2^OM7hJm&OFqbA_z2F3TgB7kkopmjmbq*3y&0}4URyA3m04z& zkRWLQ5fJ(u9P%p4ojK7OJaC6$VNo?ki}-NhGf3z)BD9eII=e1Hz~h7ue$T0!^X#b(6iLZ91buP19ZfqN*a1n*B{UE zMx4RP{E;@}0G^TRuw0|4=ocb}ywi#C94!U;SA@w#MM zB*hxyS=;D2O~NYY4lj_mfy@4&EC&t9{XJT{@m6>La}-6oEK>D&=y~-y&7-|=TjjzL zt{$&kU4_I!wZMgU7LM8et|PR6$m1}A6q{A37)egWxwAX+!2=!Q*PgfGvi@rF^an{Y zb8J7~=*raW28@tuMv)iFMHZ|gO})txz7*-kkLsaDYLC7ddB!I{Dem#?2BHSyaEj}^}r&EBjdt@zt59x(!Da1i1TvYK~oJN@6a)Bs9eqWJKHQ?d7krezXrCw3; zfR=#SAGb_@HmX-|M~7y~g3R$tqJA|}Z40-_EF38SSV$H92tU=dOj6XySA{g9oW=Gd z65jO7zoyY~FEk^WERF4CEX~y=_##=sW%Vb$w3I7&Ot(jN#dN%XjEdXKL7x_sHcQs$vM!qo*Wp>bBRO5)aW;oNi zuxAU`BTL+xo1Zw_r3^_?!>a(5?NS1weji%QW;}lfj==Ai>nm3RM%&y30<_?-Ad3Sl zdO^Eb7=<6+71=R*_nCt%fH{hx=8k<8?RXX@rj(WVo4OF$B@pi`hB-sDA6_m_ve+u; z2IX=!EJQhWp_jIVy;mbS;7Kh$ww8Tch>-Q$SsQFBw{9t1X~j`l`0OhJn&&W^aMgO3 z#Kq1c*c(WR)hYJ)fc3|9$_ZVS0os?zFdFqQlVLPzU?84IL_kVf2cMGa*v4M9C(oRI zjf5?sO_9kQmtuRtVBZdcU~1$uv2ceUo$pFlf+5Cm0JYFuH7HfPmz5Tu^E$(So98ZEMUrZbRpOgrcDd28)Z5@jL(^n$`x>F@ zRuF>PNKPkC%1E$0d72;%LJtBurEKm4zk9Cco>)dn(%b`g+w9D}Ko3aE+zVfu%niK& zf3Jy{`*o&e2IhXVsY~kRUKl#$TxJ-)m)!J2sp-M)&YGuw43r}>!s&C?563f@MNXZ+ zemIuzn|Yoim;DISu{&FxJg+^ztF2s{U%qaHJoS76PS<`dhW!OwQLD9X4g01QWkTF?C1Y&l?vh1`*Y}!NvW&NOJ*%Uu2T-kR!#9}o); zHQoTIb%2@#hOBonisiewL}MHdAa}P7AE@GClvoxflsGn2-AI?#pwZjtGfIb1@Po)I_F8V#A literal 0 HcmV?d00001 diff --git a/public/assets/admin-ac55ef6d0ab68e7b7fc33b36616fb687dab371f3c6c8414daffe341ab264ab2c.js b/public/assets/admin-ac55ef6d0ab68e7b7fc33b36616fb687dab371f3c6c8414daffe341ab264ab2c.js new file mode 100644 index 000000000..1babfe26b --- /dev/null +++ b/public/assets/admin-ac55ef6d0ab68e7b7fc33b36616fb687dab371f3c6c8414daffe341ab264ab2c.js @@ -0,0 +1,140360 @@ +/* +Unobtrusive JavaScript +https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts +Released under the MIT license + */ +; + +(function() { + var context = this; + + (function() { + (function() { + this.Rails = { + linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]:not([disabled]), a[data-disable-with], a[data-disable]', + buttonClickSelector: { + selector: 'button[data-remote]:not([form]), button[data-confirm]:not([form])', + exclude: 'form button' + }, + inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]', + formSubmitSelector: 'form', + formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type]), input[type=submit][form], input[type=image][form], button[type=submit][form], button[form]:not([type])', + formDisableSelector: 'input[data-disable-with]:enabled, button[data-disable-with]:enabled, textarea[data-disable-with]:enabled, input[data-disable]:enabled, button[data-disable]:enabled, textarea[data-disable]:enabled', + formEnableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled, input[data-disable]:disabled, button[data-disable]:disabled, textarea[data-disable]:disabled', + fileInputSelector: 'input[name][type=file]:not([disabled])', + linkDisableSelector: 'a[data-disable-with], a[data-disable]', + buttonDisableSelector: 'button[data-remote][data-disable-with], button[data-remote][data-disable]' + }; + + }).call(this); + }).call(context); + + var Rails = context.Rails; + + (function() { + (function() { + var nonce; + + nonce = null; + + Rails.loadCSPNonce = function() { + var ref; + return nonce = (ref = document.querySelector("meta[name=csp-nonce]")) != null ? ref.content : void 0; + }; + + Rails.cspNonce = function() { + return nonce != null ? nonce : Rails.loadCSPNonce(); + }; + + }).call(this); + (function() { + var expando, m; + + m = Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector; + + Rails.matches = function(element, selector) { + if (selector.exclude != null) { + return m.call(element, selector.selector) && !m.call(element, selector.exclude); + } else { + return m.call(element, selector); + } + }; + + expando = '_ujsData'; + + Rails.getData = function(element, key) { + var ref; + return (ref = element[expando]) != null ? ref[key] : void 0; + }; + + Rails.setData = function(element, key, value) { + if (element[expando] == null) { + element[expando] = {}; + } + return element[expando][key] = value; + }; + + Rails.$ = function(selector) { + return Array.prototype.slice.call(document.querySelectorAll(selector)); + }; + + }).call(this); + (function() { + var $, csrfParam, csrfToken; + + $ = Rails.$; + + csrfToken = Rails.csrfToken = function() { + var meta; + meta = document.querySelector('meta[name=csrf-token]'); + return meta && meta.content; + }; + + csrfParam = Rails.csrfParam = function() { + var meta; + meta = document.querySelector('meta[name=csrf-param]'); + return meta && meta.content; + }; + + Rails.CSRFProtection = function(xhr) { + var token; + token = csrfToken(); + if (token != null) { + return xhr.setRequestHeader('X-CSRF-Token', token); + } + }; + + Rails.refreshCSRFTokens = function() { + var param, token; + token = csrfToken(); + param = csrfParam(); + if ((token != null) && (param != null)) { + return $('form input[name="' + param + '"]').forEach(function(input) { + return input.value = token; + }); + } + }; + + }).call(this); + (function() { + var CustomEvent, fire, matches, preventDefault; + + matches = Rails.matches; + + CustomEvent = window.CustomEvent; + + if (typeof CustomEvent !== 'function') { + CustomEvent = function(event, params) { + var evt; + evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + }; + CustomEvent.prototype = window.Event.prototype; + preventDefault = CustomEvent.prototype.preventDefault; + CustomEvent.prototype.preventDefault = function() { + var result; + result = preventDefault.call(this); + if (this.cancelable && !this.defaultPrevented) { + Object.defineProperty(this, 'defaultPrevented', { + get: function() { + return true; + } + }); + } + return result; + }; + } + + fire = Rails.fire = function(obj, name, data) { + var event; + event = new CustomEvent(name, { + bubbles: true, + cancelable: true, + detail: data + }); + obj.dispatchEvent(event); + return !event.defaultPrevented; + }; + + Rails.stopEverything = function(e) { + fire(e.target, 'ujs:everythingStopped'); + e.preventDefault(); + e.stopPropagation(); + return e.stopImmediatePropagation(); + }; + + Rails.delegate = function(element, selector, eventType, handler) { + return element.addEventListener(eventType, function(e) { + var target; + target = e.target; + while (!(!(target instanceof Element) || matches(target, selector))) { + target = target.parentNode; + } + if (target instanceof Element && handler.call(target, e) === false) { + e.preventDefault(); + return e.stopPropagation(); + } + }); + }; + + }).call(this); + (function() { + var AcceptHeaders, CSRFProtection, createXHR, cspNonce, fire, prepareOptions, processResponse; + + cspNonce = Rails.cspNonce, CSRFProtection = Rails.CSRFProtection, fire = Rails.fire; + + AcceptHeaders = { + '*': '*/*', + text: 'text/plain', + html: 'text/html', + xml: 'application/xml, text/xml', + json: 'application/json, text/javascript', + script: 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript' + }; + + Rails.ajax = function(options) { + var xhr; + options = prepareOptions(options); + xhr = createXHR(options, function() { + var ref, response; + response = processResponse((ref = xhr.response) != null ? ref : xhr.responseText, xhr.getResponseHeader('Content-Type')); + if (Math.floor(xhr.status / 100) === 2) { + if (typeof options.success === "function") { + options.success(response, xhr.statusText, xhr); + } + } else { + if (typeof options.error === "function") { + options.error(response, xhr.statusText, xhr); + } + } + return typeof options.complete === "function" ? options.complete(xhr, xhr.statusText) : void 0; + }); + if ((options.beforeSend != null) && !options.beforeSend(xhr, options)) { + return false; + } + if (xhr.readyState === XMLHttpRequest.OPENED) { + return xhr.send(options.data); + } + }; + + prepareOptions = function(options) { + options.url = options.url || location.href; + options.type = options.type.toUpperCase(); + if (options.type === 'GET' && options.data) { + if (options.url.indexOf('?') < 0) { + options.url += '?' + options.data; + } else { + options.url += '&' + options.data; + } + } + if (AcceptHeaders[options.dataType] == null) { + options.dataType = '*'; + } + options.accept = AcceptHeaders[options.dataType]; + if (options.dataType !== '*') { + options.accept += ', */*; q=0.01'; + } + return options; + }; + + createXHR = function(options, done) { + var xhr; + xhr = new XMLHttpRequest(); + xhr.open(options.type, options.url, true); + xhr.setRequestHeader('Accept', options.accept); + if (typeof options.data === 'string') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); + } + if (!options.crossDomain) { + xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + } + CSRFProtection(xhr); + xhr.withCredentials = !!options.withCredentials; + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + return done(xhr); + } + }; + return xhr; + }; + + processResponse = function(response, type) { + var parser, script; + if (typeof response === 'string' && typeof type === 'string') { + if (type.match(/\bjson\b/)) { + try { + response = JSON.parse(response); + } catch (error) {} + } else if (type.match(/\b(?:java|ecma)script\b/)) { + script = document.createElement('script'); + script.setAttribute('nonce', cspNonce()); + script.text = response; + document.head.appendChild(script).parentNode.removeChild(script); + } else if (type.match(/\b(xml|html|svg)\b/)) { + parser = new DOMParser(); + type = type.replace(/;.+/, ''); + try { + response = parser.parseFromString(response, type); + } catch (error) {} + } + } + return response; + }; + + Rails.href = function(element) { + return element.href; + }; + + Rails.isCrossDomain = function(url) { + var e, originAnchor, urlAnchor; + originAnchor = document.createElement('a'); + originAnchor.href = location.href; + urlAnchor = document.createElement('a'); + try { + urlAnchor.href = url; + return !(((!urlAnchor.protocol || urlAnchor.protocol === ':') && !urlAnchor.host) || (originAnchor.protocol + '//' + originAnchor.host === urlAnchor.protocol + '//' + urlAnchor.host)); + } catch (error) { + e = error; + return true; + } + }; + + }).call(this); + (function() { + var matches, toArray; + + matches = Rails.matches; + + toArray = function(e) { + return Array.prototype.slice.call(e); + }; + + Rails.serializeElement = function(element, additionalParam) { + var inputs, params; + inputs = [element]; + if (matches(element, 'form')) { + inputs = toArray(element.elements); + } + params = []; + inputs.forEach(function(input) { + if (!input.name || input.disabled) { + return; + } + if (matches(input, 'select')) { + return toArray(input.options).forEach(function(option) { + if (option.selected) { + return params.push({ + name: input.name, + value: option.value + }); + } + }); + } else if (input.checked || ['radio', 'checkbox', 'submit'].indexOf(input.type) === -1) { + return params.push({ + name: input.name, + value: input.value + }); + } + }); + if (additionalParam) { + params.push(additionalParam); + } + return params.map(function(param) { + if (param.name != null) { + return (encodeURIComponent(param.name)) + "=" + (encodeURIComponent(param.value)); + } else { + return param; + } + }).join('&'); + }; + + Rails.formElements = function(form, selector) { + if (matches(form, 'form')) { + return toArray(form.elements).filter(function(el) { + return matches(el, selector); + }); + } else { + return toArray(form.querySelectorAll(selector)); + } + }; + + }).call(this); + (function() { + var allowAction, fire, stopEverything; + + fire = Rails.fire, stopEverything = Rails.stopEverything; + + Rails.handleConfirm = function(e) { + if (!allowAction(this)) { + return stopEverything(e); + } + }; + + allowAction = function(element) { + var answer, callback, message; + message = element.getAttribute('data-confirm'); + if (!message) { + return true; + } + answer = false; + if (fire(element, 'confirm')) { + try { + answer = confirm(message); + } catch (error) {} + callback = fire(element, 'confirm:complete', [answer]); + } + return answer && callback; + }; + + }).call(this); + (function() { + var disableFormElement, disableFormElements, disableLinkElement, enableFormElement, enableFormElements, enableLinkElement, formElements, getData, matches, setData, stopEverything; + + matches = Rails.matches, getData = Rails.getData, setData = Rails.setData, stopEverything = Rails.stopEverything, formElements = Rails.formElements; + + Rails.handleDisabledElement = function(e) { + var element; + element = this; + if (element.disabled) { + return stopEverything(e); + } + }; + + Rails.enableElement = function(e) { + var element; + element = e instanceof Event ? e.target : e; + if (matches(element, Rails.linkDisableSelector)) { + return enableLinkElement(element); + } else if (matches(element, Rails.buttonDisableSelector) || matches(element, Rails.formEnableSelector)) { + return enableFormElement(element); + } else if (matches(element, Rails.formSubmitSelector)) { + return enableFormElements(element); + } + }; + + Rails.disableElement = function(e) { + var element; + element = e instanceof Event ? e.target : e; + if (matches(element, Rails.linkDisableSelector)) { + return disableLinkElement(element); + } else if (matches(element, Rails.buttonDisableSelector) || matches(element, Rails.formDisableSelector)) { + return disableFormElement(element); + } else if (matches(element, Rails.formSubmitSelector)) { + return disableFormElements(element); + } + }; + + disableLinkElement = function(element) { + var replacement; + replacement = element.getAttribute('data-disable-with'); + if (replacement != null) { + setData(element, 'ujs:enable-with', element.innerHTML); + element.innerHTML = replacement; + } + element.addEventListener('click', stopEverything); + return setData(element, 'ujs:disabled', true); + }; + + enableLinkElement = function(element) { + var originalText; + originalText = getData(element, 'ujs:enable-with'); + if (originalText != null) { + element.innerHTML = originalText; + setData(element, 'ujs:enable-with', null); + } + element.removeEventListener('click', stopEverything); + return setData(element, 'ujs:disabled', null); + }; + + disableFormElements = function(form) { + return formElements(form, Rails.formDisableSelector).forEach(disableFormElement); + }; + + disableFormElement = function(element) { + var replacement; + replacement = element.getAttribute('data-disable-with'); + if (replacement != null) { + if (matches(element, 'button')) { + setData(element, 'ujs:enable-with', element.innerHTML); + element.innerHTML = replacement; + } else { + setData(element, 'ujs:enable-with', element.value); + element.value = replacement; + } + } + element.disabled = true; + return setData(element, 'ujs:disabled', true); + }; + + enableFormElements = function(form) { + return formElements(form, Rails.formEnableSelector).forEach(enableFormElement); + }; + + enableFormElement = function(element) { + var originalText; + originalText = getData(element, 'ujs:enable-with'); + if (originalText != null) { + if (matches(element, 'button')) { + element.innerHTML = originalText; + } else { + element.value = originalText; + } + setData(element, 'ujs:enable-with', null); + } + element.disabled = false; + return setData(element, 'ujs:disabled', null); + }; + + }).call(this); + (function() { + var stopEverything; + + stopEverything = Rails.stopEverything; + + Rails.handleMethod = function(e) { + var csrfParam, csrfToken, form, formContent, href, link, method; + link = this; + method = link.getAttribute('data-method'); + if (!method) { + return; + } + href = Rails.href(link); + csrfToken = Rails.csrfToken(); + csrfParam = Rails.csrfParam(); + form = document.createElement('form'); + formContent = ""; + if ((csrfParam != null) && (csrfToken != null) && !Rails.isCrossDomain(href)) { + formContent += ""; + } + formContent += ''; + form.method = 'post'; + form.action = href; + form.target = link.target; + form.innerHTML = formContent; + form.style.display = 'none'; + document.body.appendChild(form); + form.querySelector('[type="submit"]').click(); + return stopEverything(e); + }; + + }).call(this); + (function() { + var ajax, fire, getData, isCrossDomain, isRemote, matches, serializeElement, setData, stopEverything, + slice = [].slice; + + matches = Rails.matches, getData = Rails.getData, setData = Rails.setData, fire = Rails.fire, stopEverything = Rails.stopEverything, ajax = Rails.ajax, isCrossDomain = Rails.isCrossDomain, serializeElement = Rails.serializeElement; + + isRemote = function(element) { + var value; + value = element.getAttribute('data-remote'); + return (value != null) && value !== 'false'; + }; + + Rails.handleRemote = function(e) { + var button, data, dataType, element, method, url, withCredentials; + element = this; + if (!isRemote(element)) { + return true; + } + if (!fire(element, 'ajax:before')) { + fire(element, 'ajax:stopped'); + return false; + } + withCredentials = element.getAttribute('data-with-credentials'); + dataType = element.getAttribute('data-type') || 'script'; + if (matches(element, Rails.formSubmitSelector)) { + button = getData(element, 'ujs:submit-button'); + method = getData(element, 'ujs:submit-button-formmethod') || element.method; + url = getData(element, 'ujs:submit-button-formaction') || element.getAttribute('action') || location.href; + if (method.toUpperCase() === 'GET') { + url = url.replace(/\?.*$/, ''); + } + if (element.enctype === 'multipart/form-data') { + data = new FormData(element); + if (button != null) { + data.append(button.name, button.value); + } + } else { + data = serializeElement(element, button); + } + setData(element, 'ujs:submit-button', null); + setData(element, 'ujs:submit-button-formmethod', null); + setData(element, 'ujs:submit-button-formaction', null); + } else if (matches(element, Rails.buttonClickSelector) || matches(element, Rails.inputChangeSelector)) { + method = element.getAttribute('data-method'); + url = element.getAttribute('data-url'); + data = serializeElement(element, element.getAttribute('data-params')); + } else { + method = element.getAttribute('data-method'); + url = Rails.href(element); + data = element.getAttribute('data-params'); + } + ajax({ + type: method || 'GET', + url: url, + data: data, + dataType: dataType, + beforeSend: function(xhr, options) { + if (fire(element, 'ajax:beforeSend', [xhr, options])) { + return fire(element, 'ajax:send', [xhr]); + } else { + fire(element, 'ajax:stopped'); + return false; + } + }, + success: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:success', args); + }, + error: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:error', args); + }, + complete: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:complete', args); + }, + crossDomain: isCrossDomain(url), + withCredentials: (withCredentials != null) && withCredentials !== 'false' + }); + return stopEverything(e); + }; + + Rails.formSubmitButtonClick = function(e) { + var button, form; + button = this; + form = button.form; + if (!form) { + return; + } + if (button.name) { + setData(form, 'ujs:submit-button', { + name: button.name, + value: button.value + }); + } + setData(form, 'ujs:formnovalidate-button', button.formNoValidate); + setData(form, 'ujs:submit-button-formaction', button.getAttribute('formaction')); + return setData(form, 'ujs:submit-button-formmethod', button.getAttribute('formmethod')); + }; + + Rails.preventInsignificantClick = function(e) { + var data, insignificantMetaClick, link, metaClick, method, nonPrimaryMouseClick; + link = this; + method = (link.getAttribute('data-method') || 'GET').toUpperCase(); + data = link.getAttribute('data-params'); + metaClick = e.metaKey || e.ctrlKey; + insignificantMetaClick = metaClick && method === 'GET' && !data; + nonPrimaryMouseClick = (e.button != null) && e.button !== 0; + if (nonPrimaryMouseClick || insignificantMetaClick) { + return e.stopImmediatePropagation(); + } + }; + + }).call(this); + (function() { + var $, CSRFProtection, delegate, disableElement, enableElement, fire, formSubmitButtonClick, getData, handleConfirm, handleDisabledElement, handleMethod, handleRemote, loadCSPNonce, preventInsignificantClick, refreshCSRFTokens; + + fire = Rails.fire, delegate = Rails.delegate, getData = Rails.getData, $ = Rails.$, refreshCSRFTokens = Rails.refreshCSRFTokens, CSRFProtection = Rails.CSRFProtection, loadCSPNonce = Rails.loadCSPNonce, enableElement = Rails.enableElement, disableElement = Rails.disableElement, handleDisabledElement = Rails.handleDisabledElement, handleConfirm = Rails.handleConfirm, preventInsignificantClick = Rails.preventInsignificantClick, handleRemote = Rails.handleRemote, formSubmitButtonClick = Rails.formSubmitButtonClick, handleMethod = Rails.handleMethod; + + if ((typeof jQuery !== "undefined" && jQuery !== null) && (jQuery.ajax != null)) { + if (jQuery.rails) { + throw new Error('If you load both jquery_ujs and rails-ujs, use rails-ujs only.'); + } + jQuery.rails = Rails; + jQuery.ajaxPrefilter(function(options, originalOptions, xhr) { + if (!options.crossDomain) { + return CSRFProtection(xhr); + } + }); + } + + Rails.start = function() { + if (window._rails_loaded) { + throw new Error('rails-ujs has already been loaded!'); + } + window.addEventListener('pageshow', function() { + $(Rails.formEnableSelector).forEach(function(el) { + if (getData(el, 'ujs:disabled')) { + return enableElement(el); + } + }); + return $(Rails.linkDisableSelector).forEach(function(el) { + if (getData(el, 'ujs:disabled')) { + return enableElement(el); + } + }); + }); + delegate(document, Rails.linkDisableSelector, 'ajax:complete', enableElement); + delegate(document, Rails.linkDisableSelector, 'ajax:stopped', enableElement); + delegate(document, Rails.buttonDisableSelector, 'ajax:complete', enableElement); + delegate(document, Rails.buttonDisableSelector, 'ajax:stopped', enableElement); + delegate(document, Rails.linkClickSelector, 'click', preventInsignificantClick); + delegate(document, Rails.linkClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.linkClickSelector, 'click', handleConfirm); + delegate(document, Rails.linkClickSelector, 'click', disableElement); + delegate(document, Rails.linkClickSelector, 'click', handleRemote); + delegate(document, Rails.linkClickSelector, 'click', handleMethod); + delegate(document, Rails.buttonClickSelector, 'click', preventInsignificantClick); + delegate(document, Rails.buttonClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.buttonClickSelector, 'click', handleConfirm); + delegate(document, Rails.buttonClickSelector, 'click', disableElement); + delegate(document, Rails.buttonClickSelector, 'click', handleRemote); + delegate(document, Rails.inputChangeSelector, 'change', handleDisabledElement); + delegate(document, Rails.inputChangeSelector, 'change', handleConfirm); + delegate(document, Rails.inputChangeSelector, 'change', handleRemote); + delegate(document, Rails.formSubmitSelector, 'submit', handleDisabledElement); + delegate(document, Rails.formSubmitSelector, 'submit', handleConfirm); + delegate(document, Rails.formSubmitSelector, 'submit', handleRemote); + delegate(document, Rails.formSubmitSelector, 'submit', function(e) { + return setTimeout((function() { + return disableElement(e); + }), 13); + }); + delegate(document, Rails.formSubmitSelector, 'ajax:send', disableElement); + delegate(document, Rails.formSubmitSelector, 'ajax:complete', enableElement); + delegate(document, Rails.formInputClickSelector, 'click', preventInsignificantClick); + delegate(document, Rails.formInputClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.formInputClickSelector, 'click', handleConfirm); + delegate(document, Rails.formInputClickSelector, 'click', formSubmitButtonClick); + document.addEventListener('DOMContentLoaded', refreshCSRFTokens); + document.addEventListener('DOMContentLoaded', loadCSPNonce); + return window._rails_loaded = true; + }; + + if (window.Rails === Rails && fire(document, 'rails:attachBindings')) { + Rails.start(); + } + + }).call(this); + }).call(this); + + if (typeof module === "object" && module.exports) { + module.exports = Rails; + } else if (typeof define === "function" && define.amd) { + define(Rails); + } +}).call(this); +(function(global, factory) { + typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define([ "exports" ], factory) : factory(global.ActiveStorage = {}); +})(this, function(exports) { + "use strict"; + function createCommonjsModule(fn, module) { + return module = { + exports: {} + }, fn(module, module.exports), module.exports; + } + var sparkMd5 = createCommonjsModule(function(module, exports) { + (function(factory) { + { + module.exports = factory(); + } + })(function(undefined) { + var hex_chr = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" ]; + function md5cycle(x, k) { + var a = x[0], b = x[1], c = x[2], d = x[3]; + a += (b & c | ~b & d) + k[0] - 680876936 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[1] - 389564586 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[2] + 606105819 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[3] - 1044525330 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[4] - 176418897 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[5] + 1200080426 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[6] - 1473231341 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[7] - 45705983 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[8] + 1770035416 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[9] - 1958414417 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[10] - 42063 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[11] - 1990404162 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[12] + 1804603682 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[13] - 40341101 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[14] - 1502002290 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[15] + 1236535329 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & d | c & ~d) + k[1] - 165796510 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[6] - 1069501632 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[11] + 643717713 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[0] - 373897302 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[5] - 701558691 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[10] + 38016083 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[15] - 660478335 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[4] - 405537848 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[9] + 568446438 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[14] - 1019803690 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[3] - 187363961 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[8] + 1163531501 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[13] - 1444681467 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[2] - 51403784 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[7] + 1735328473 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[12] - 1926607734 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b ^ c ^ d) + k[5] - 378558 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[8] - 2022574463 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[11] + 1839030562 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[14] - 35309556 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[1] - 1530992060 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[4] + 1272893353 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[7] - 155497632 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[10] - 1094730640 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[13] + 681279174 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[0] - 358537222 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[3] - 722521979 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[6] + 76029189 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[9] - 640364487 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[12] - 421815835 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[15] + 530742520 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[2] - 995338651 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (c ^ (b | ~d)) + k[0] - 198630844 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[5] - 57434055 | 0; + b = (b << 21 | b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[10] - 1051523 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0; + b = (b << 21 | b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[15] - 30611744 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0; + b = (b << 21 | b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[4] - 145523070 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[2] + 718787259 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[9] - 343485551 | 0; + b = (b << 21 | b >>> 11) + c | 0; + x[0] = a + x[0] | 0; + x[1] = b + x[1] | 0; + x[2] = c + x[2] | 0; + x[3] = d + x[3] | 0; + } + function md5blk(s) { + var md5blks = [], i; + for (i = 0; i < 64; i += 4) { + md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24); + } + return md5blks; + } + function md5blk_array(a) { + var md5blks = [], i; + for (i = 0; i < 64; i += 4) { + md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24); + } + return md5blks; + } + function md51(s) { + var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi; + for (i = 64; i <= n; i += 64) { + md5cycle(state, md5blk(s.substring(i - 64, i))); + } + s = s.substring(i - 64); + length = s.length; + tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3); + } + tail[i >> 2] |= 128 << (i % 4 << 3); + if (i > 55) { + md5cycle(state, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + tmp = n * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + tail[14] = lo; + tail[15] = hi; + md5cycle(state, tail); + return state; + } + function md51_array(a) { + var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi; + for (i = 64; i <= n; i += 64) { + md5cycle(state, md5blk_array(a.subarray(i - 64, i))); + } + a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0); + length = a.length; + tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= a[i] << (i % 4 << 3); + } + tail[i >> 2] |= 128 << (i % 4 << 3); + if (i > 55) { + md5cycle(state, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + tmp = n * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + tail[14] = lo; + tail[15] = hi; + md5cycle(state, tail); + return state; + } + function rhex(n) { + var s = "", j; + for (j = 0; j < 4; j += 1) { + s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15]; + } + return s; + } + function hex(x) { + var i; + for (i = 0; i < x.length; i += 1) { + x[i] = rhex(x[i]); + } + return x.join(""); + } + if (hex(md51("hello")) !== "5d41402abc4b2a76b9719d911017c592") ; + if (typeof ArrayBuffer !== "undefined" && !ArrayBuffer.prototype.slice) { + (function() { + function clamp(val, length) { + val = val | 0 || 0; + if (val < 0) { + return Math.max(val + length, 0); + } + return Math.min(val, length); + } + ArrayBuffer.prototype.slice = function(from, to) { + var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray; + if (to !== undefined) { + end = clamp(to, length); + } + if (begin > end) { + return new ArrayBuffer(0); + } + num = end - begin; + target = new ArrayBuffer(num); + targetArray = new Uint8Array(target); + sourceArray = new Uint8Array(this, begin, num); + targetArray.set(sourceArray); + return target; + }; + })(); + } + function toUtf8(str) { + if (/[\u0080-\uFFFF]/.test(str)) { + str = unescape(encodeURIComponent(str)); + } + return str; + } + function utf8Str2ArrayBuffer(str, returnUInt8Array) { + var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i; + for (i = 0; i < length; i += 1) { + arr[i] = str.charCodeAt(i); + } + return returnUInt8Array ? arr : buff; + } + function arrayBuffer2Utf8Str(buff) { + return String.fromCharCode.apply(null, new Uint8Array(buff)); + } + function concatenateArrayBuffers(first, second, returnUInt8Array) { + var result = new Uint8Array(first.byteLength + second.byteLength); + result.set(new Uint8Array(first)); + result.set(new Uint8Array(second), first.byteLength); + return returnUInt8Array ? result : result.buffer; + } + function hexToBinaryString(hex) { + var bytes = [], length = hex.length, x; + for (x = 0; x < length - 1; x += 2) { + bytes.push(parseInt(hex.substr(x, 2), 16)); + } + return String.fromCharCode.apply(String, bytes); + } + function SparkMD5() { + this.reset(); + } + SparkMD5.prototype.append = function(str) { + this.appendBinary(toUtf8(str)); + return this; + }; + SparkMD5.prototype.appendBinary = function(contents) { + this._buff += contents; + this._length += contents.length; + var length = this._buff.length, i; + for (i = 64; i <= length; i += 64) { + md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i))); + } + this._buff = this._buff.substring(i - 64); + return this; + }; + SparkMD5.prototype.end = function(raw) { + var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret; + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3); + } + this._finish(tail, length); + ret = hex(this._hash); + if (raw) { + ret = hexToBinaryString(ret); + } + this.reset(); + return ret; + }; + SparkMD5.prototype.reset = function() { + this._buff = ""; + this._length = 0; + this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ]; + return this; + }; + SparkMD5.prototype.getState = function() { + return { + buff: this._buff, + length: this._length, + hash: this._hash + }; + }; + SparkMD5.prototype.setState = function(state) { + this._buff = state.buff; + this._length = state.length; + this._hash = state.hash; + return this; + }; + SparkMD5.prototype.destroy = function() { + delete this._hash; + delete this._buff; + delete this._length; + }; + SparkMD5.prototype._finish = function(tail, length) { + var i = length, tmp, lo, hi; + tail[i >> 2] |= 128 << (i % 4 << 3); + if (i > 55) { + md5cycle(this._hash, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + tmp = this._length * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + tail[14] = lo; + tail[15] = hi; + md5cycle(this._hash, tail); + }; + SparkMD5.hash = function(str, raw) { + return SparkMD5.hashBinary(toUtf8(str), raw); + }; + SparkMD5.hashBinary = function(content, raw) { + var hash = md51(content), ret = hex(hash); + return raw ? hexToBinaryString(ret) : ret; + }; + SparkMD5.ArrayBuffer = function() { + this.reset(); + }; + SparkMD5.ArrayBuffer.prototype.append = function(arr) { + var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i; + this._length += arr.byteLength; + for (i = 64; i <= length; i += 64) { + md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i))); + } + this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0); + return this; + }; + SparkMD5.ArrayBuffer.prototype.end = function(raw) { + var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret; + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= buff[i] << (i % 4 << 3); + } + this._finish(tail, length); + ret = hex(this._hash); + if (raw) { + ret = hexToBinaryString(ret); + } + this.reset(); + return ret; + }; + SparkMD5.ArrayBuffer.prototype.reset = function() { + this._buff = new Uint8Array(0); + this._length = 0; + this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ]; + return this; + }; + SparkMD5.ArrayBuffer.prototype.getState = function() { + var state = SparkMD5.prototype.getState.call(this); + state.buff = arrayBuffer2Utf8Str(state.buff); + return state; + }; + SparkMD5.ArrayBuffer.prototype.setState = function(state) { + state.buff = utf8Str2ArrayBuffer(state.buff, true); + return SparkMD5.prototype.setState.call(this, state); + }; + SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy; + SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish; + SparkMD5.ArrayBuffer.hash = function(arr, raw) { + var hash = md51_array(new Uint8Array(arr)), ret = hex(hash); + return raw ? hexToBinaryString(ret) : ret; + }; + return SparkMD5; + }); + }); + var classCallCheck = function(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + var createClass = function() { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + return function(Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + var fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice; + var FileChecksum = function() { + createClass(FileChecksum, null, [ { + key: "create", + value: function create(file, callback) { + var instance = new FileChecksum(file); + instance.create(callback); + } + } ]); + function FileChecksum(file) { + classCallCheck(this, FileChecksum); + this.file = file; + this.chunkSize = 2097152; + this.chunkCount = Math.ceil(this.file.size / this.chunkSize); + this.chunkIndex = 0; + } + createClass(FileChecksum, [ { + key: "create", + value: function create(callback) { + var _this = this; + this.callback = callback; + this.md5Buffer = new sparkMd5.ArrayBuffer(); + this.fileReader = new FileReader(); + this.fileReader.addEventListener("load", function(event) { + return _this.fileReaderDidLoad(event); + }); + this.fileReader.addEventListener("error", function(event) { + return _this.fileReaderDidError(event); + }); + this.readNextChunk(); + } + }, { + key: "fileReaderDidLoad", + value: function fileReaderDidLoad(event) { + this.md5Buffer.append(event.target.result); + if (!this.readNextChunk()) { + var binaryDigest = this.md5Buffer.end(true); + var base64digest = btoa(binaryDigest); + this.callback(null, base64digest); + } + } + }, { + key: "fileReaderDidError", + value: function fileReaderDidError(event) { + this.callback("Error reading " + this.file.name); + } + }, { + key: "readNextChunk", + value: function readNextChunk() { + if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) { + var start = this.chunkIndex * this.chunkSize; + var end = Math.min(start + this.chunkSize, this.file.size); + var bytes = fileSlice.call(this.file, start, end); + this.fileReader.readAsArrayBuffer(bytes); + this.chunkIndex++; + return true; + } else { + return false; + } + } + } ]); + return FileChecksum; + }(); + function getMetaValue(name) { + var element = findElement(document.head, 'meta[name="' + name + '"]'); + if (element) { + return element.getAttribute("content"); + } + } + function findElements(root, selector) { + if (typeof root == "string") { + selector = root; + root = document; + } + var elements = root.querySelectorAll(selector); + return toArray$1(elements); + } + function findElement(root, selector) { + if (typeof root == "string") { + selector = root; + root = document; + } + return root.querySelector(selector); + } + function dispatchEvent(element, type) { + var eventInit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var disabled = element.disabled; + var bubbles = eventInit.bubbles, cancelable = eventInit.cancelable, detail = eventInit.detail; + var event = document.createEvent("Event"); + event.initEvent(type, bubbles || true, cancelable || true); + event.detail = detail || {}; + try { + element.disabled = false; + element.dispatchEvent(event); + } finally { + element.disabled = disabled; + } + return event; + } + function toArray$1(value) { + if (Array.isArray(value)) { + return value; + } else if (Array.from) { + return Array.from(value); + } else { + return [].slice.call(value); + } + } + var BlobRecord = function() { + function BlobRecord(file, checksum, url) { + var _this = this; + classCallCheck(this, BlobRecord); + this.file = file; + this.attributes = { + filename: file.name, + content_type: file.type, + byte_size: file.size, + checksum: checksum + }; + this.xhr = new XMLHttpRequest(); + this.xhr.open("POST", url, true); + this.xhr.responseType = "json"; + this.xhr.setRequestHeader("Content-Type", "application/json"); + this.xhr.setRequestHeader("Accept", "application/json"); + this.xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + this.xhr.setRequestHeader("X-CSRF-Token", getMetaValue("csrf-token")); + this.xhr.addEventListener("load", function(event) { + return _this.requestDidLoad(event); + }); + this.xhr.addEventListener("error", function(event) { + return _this.requestDidError(event); + }); + } + createClass(BlobRecord, [ { + key: "create", + value: function create(callback) { + this.callback = callback; + this.xhr.send(JSON.stringify({ + blob: this.attributes + })); + } + }, { + key: "requestDidLoad", + value: function requestDidLoad(event) { + if (this.status >= 200 && this.status < 300) { + var response = this.response; + var direct_upload = response.direct_upload; + delete response.direct_upload; + this.attributes = response; + this.directUploadData = direct_upload; + this.callback(null, this.toJSON()); + } else { + this.requestDidError(event); + } + } + }, { + key: "requestDidError", + value: function requestDidError(event) { + this.callback('Error creating Blob for "' + this.file.name + '". Status: ' + this.status); + } + }, { + key: "toJSON", + value: function toJSON() { + var result = {}; + for (var key in this.attributes) { + result[key] = this.attributes[key]; + } + return result; + } + }, { + key: "status", + get: function get$$1() { + return this.xhr.status; + } + }, { + key: "response", + get: function get$$1() { + var _xhr = this.xhr, responseType = _xhr.responseType, response = _xhr.response; + if (responseType == "json") { + return response; + } else { + return JSON.parse(response); + } + } + } ]); + return BlobRecord; + }(); + var BlobUpload = function() { + function BlobUpload(blob) { + var _this = this; + classCallCheck(this, BlobUpload); + this.blob = blob; + this.file = blob.file; + var _blob$directUploadDat = blob.directUploadData, url = _blob$directUploadDat.url, headers = _blob$directUploadDat.headers; + this.xhr = new XMLHttpRequest(); + this.xhr.open("PUT", url, true); + this.xhr.responseType = "text"; + for (var key in headers) { + this.xhr.setRequestHeader(key, headers[key]); + } + this.xhr.addEventListener("load", function(event) { + return _this.requestDidLoad(event); + }); + this.xhr.addEventListener("error", function(event) { + return _this.requestDidError(event); + }); + } + createClass(BlobUpload, [ { + key: "create", + value: function create(callback) { + this.callback = callback; + this.xhr.send(this.file.slice()); + } + }, { + key: "requestDidLoad", + value: function requestDidLoad(event) { + var _xhr = this.xhr, status = _xhr.status, response = _xhr.response; + if (status >= 200 && status < 300) { + this.callback(null, response); + } else { + this.requestDidError(event); + } + } + }, { + key: "requestDidError", + value: function requestDidError(event) { + this.callback('Error storing "' + this.file.name + '". Status: ' + this.xhr.status); + } + } ]); + return BlobUpload; + }(); + var id = 0; + var DirectUpload = function() { + function DirectUpload(file, url, delegate) { + classCallCheck(this, DirectUpload); + this.id = ++id; + this.file = file; + this.url = url; + this.delegate = delegate; + } + createClass(DirectUpload, [ { + key: "create", + value: function create(callback) { + var _this = this; + FileChecksum.create(this.file, function(error, checksum) { + if (error) { + callback(error); + return; + } + var blob = new BlobRecord(_this.file, checksum, _this.url); + notify(_this.delegate, "directUploadWillCreateBlobWithXHR", blob.xhr); + blob.create(function(error) { + if (error) { + callback(error); + } else { + var upload = new BlobUpload(blob); + notify(_this.delegate, "directUploadWillStoreFileWithXHR", upload.xhr); + upload.create(function(error) { + if (error) { + callback(error); + } else { + callback(null, blob.toJSON()); + } + }); + } + }); + }); + } + } ]); + return DirectUpload; + }(); + function notify(object, methodName) { + if (object && typeof object[methodName] == "function") { + for (var _len = arguments.length, messages = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + messages[_key - 2] = arguments[_key]; + } + return object[methodName].apply(object, messages); + } + } + var DirectUploadController = function() { + function DirectUploadController(input, file) { + classCallCheck(this, DirectUploadController); + this.input = input; + this.file = file; + this.directUpload = new DirectUpload(this.file, this.url, this); + this.dispatch("initialize"); + } + createClass(DirectUploadController, [ { + key: "start", + value: function start(callback) { + var _this = this; + var hiddenInput = document.createElement("input"); + hiddenInput.type = "hidden"; + hiddenInput.name = this.input.name; + this.input.insertAdjacentElement("beforebegin", hiddenInput); + this.dispatch("start"); + this.directUpload.create(function(error, attributes) { + if (error) { + hiddenInput.parentNode.removeChild(hiddenInput); + _this.dispatchError(error); + } else { + hiddenInput.value = attributes.signed_id; + } + _this.dispatch("end"); + callback(error); + }); + } + }, { + key: "uploadRequestDidProgress", + value: function uploadRequestDidProgress(event) { + var progress = event.loaded / event.total * 100; + if (progress) { + this.dispatch("progress", { + progress: progress + }); + } + } + }, { + key: "dispatch", + value: function dispatch(name) { + var detail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + detail.file = this.file; + detail.id = this.directUpload.id; + return dispatchEvent(this.input, "direct-upload:" + name, { + detail: detail + }); + } + }, { + key: "dispatchError", + value: function dispatchError(error) { + var event = this.dispatch("error", { + error: error + }); + if (!event.defaultPrevented) { + alert(error); + } + } + }, { + key: "directUploadWillCreateBlobWithXHR", + value: function directUploadWillCreateBlobWithXHR(xhr) { + this.dispatch("before-blob-request", { + xhr: xhr + }); + } + }, { + key: "directUploadWillStoreFileWithXHR", + value: function directUploadWillStoreFileWithXHR(xhr) { + var _this2 = this; + this.dispatch("before-storage-request", { + xhr: xhr + }); + xhr.upload.addEventListener("progress", function(event) { + return _this2.uploadRequestDidProgress(event); + }); + } + }, { + key: "url", + get: function get$$1() { + return this.input.getAttribute("data-direct-upload-url"); + } + } ]); + return DirectUploadController; + }(); + var inputSelector = "input[type=file][data-direct-upload-url]:not([disabled])"; + var DirectUploadsController = function() { + function DirectUploadsController(form) { + classCallCheck(this, DirectUploadsController); + this.form = form; + this.inputs = findElements(form, inputSelector).filter(function(input) { + return input.files.length; + }); + } + createClass(DirectUploadsController, [ { + key: "start", + value: function start(callback) { + var _this = this; + var controllers = this.createDirectUploadControllers(); + var startNextController = function startNextController() { + var controller = controllers.shift(); + if (controller) { + controller.start(function(error) { + if (error) { + callback(error); + _this.dispatch("end"); + } else { + startNextController(); + } + }); + } else { + callback(); + _this.dispatch("end"); + } + }; + this.dispatch("start"); + startNextController(); + } + }, { + key: "createDirectUploadControllers", + value: function createDirectUploadControllers() { + var controllers = []; + this.inputs.forEach(function(input) { + toArray$1(input.files).forEach(function(file) { + var controller = new DirectUploadController(input, file); + controllers.push(controller); + }); + }); + return controllers; + } + }, { + key: "dispatch", + value: function dispatch(name) { + var detail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + return dispatchEvent(this.form, "direct-uploads:" + name, { + detail: detail + }); + } + } ]); + return DirectUploadsController; + }(); + var processingAttribute = "data-direct-uploads-processing"; + var submitButtonsByForm = new WeakMap(); + var started = false; + function start() { + if (!started) { + started = true; + document.addEventListener("click", didClick, true); + document.addEventListener("submit", didSubmitForm); + document.addEventListener("ajax:before", didSubmitRemoteElement); + } + } + function didClick(event) { + var target = event.target; + if ((target.tagName == "INPUT" || target.tagName == "BUTTON") && target.type == "submit" && target.form) { + submitButtonsByForm.set(target.form, target); + } + } + function didSubmitForm(event) { + handleFormSubmissionEvent(event); + } + function didSubmitRemoteElement(event) { + if (event.target.tagName == "FORM") { + handleFormSubmissionEvent(event); + } + } + function handleFormSubmissionEvent(event) { + var form = event.target; + if (form.hasAttribute(processingAttribute)) { + event.preventDefault(); + return; + } + var controller = new DirectUploadsController(form); + var inputs = controller.inputs; + if (inputs.length) { + event.preventDefault(); + form.setAttribute(processingAttribute, ""); + inputs.forEach(disable); + controller.start(function(error) { + form.removeAttribute(processingAttribute); + if (error) { + inputs.forEach(enable); + } else { + submitForm(form); + } + }); + } + } + function submitForm(form) { + var button = submitButtonsByForm.get(form) || findElement(form, "input[type=submit], button[type=submit]"); + if (button) { + var _button = button, disabled = _button.disabled; + button.disabled = false; + button.focus(); + button.click(); + button.disabled = disabled; + } else { + button = document.createElement("input"); + button.type = "submit"; + button.style.display = "none"; + form.appendChild(button); + button.click(); + form.removeChild(button); + } + submitButtonsByForm.delete(form); + } + function disable(input) { + input.disabled = true; + } + function enable(input) { + input.disabled = false; + } + function autostart() { + if (window.ActiveStorage) { + start(); + } + } + setTimeout(autostart, 1); + exports.start = start; + exports.DirectUpload = DirectUpload; + Object.defineProperty(exports, "__esModule", { + value: true + }); +}); +/* +Turbolinks 5.2.0 +Copyright © 2018 Basecamp, LLC + */ + +(function(){var t=this;(function(){(function(){this.Turbolinks={supported:function(){return null!=window.history.pushState&&null!=window.requestAnimationFrame&&null!=window.addEventListener}(),visit:function(t,r){return e.controller.visit(t,r)},clearCache:function(){return e.controller.clearCache()},setProgressBarDelay:function(t){return e.controller.setProgressBarDelay(t)}}}).call(this)}).call(t);var e=t.Turbolinks;(function(){(function(){var t,r,n,o=[].slice;e.copyObject=function(t){var e,r,n;r={};for(e in t)n=t[e],r[e]=n;return r},e.closest=function(e,r){return t.call(e,r)},t=function(){var t,e;return t=document.documentElement,null!=(e=t.closest)?e:function(t){var e;for(e=this;e;){if(e.nodeType===Node.ELEMENT_NODE&&r.call(e,t))return e;e=e.parentNode}}}(),e.defer=function(t){return setTimeout(t,1)},e.throttle=function(t){var e;return e=null,function(){var r;return r=1<=arguments.length?o.call(arguments,0):[],null!=e?e:e=requestAnimationFrame(function(n){return function(){return e=null,t.apply(n,r)}}(this))}},e.dispatch=function(t,e){var r,o,i,s,a,u;return a=null!=e?e:{},u=a.target,r=a.cancelable,o=a.data,i=document.createEvent("Events"),i.initEvent(t,!0,r===!0),i.data=null!=o?o:{},i.cancelable&&!n&&(s=i.preventDefault,i.preventDefault=function(){return this.defaultPrevented||Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}}),s.call(this)}),(null!=u?u:document).dispatchEvent(i),i},n=function(){var t;return t=document.createEvent("Events"),t.initEvent("test",!0,!0),t.preventDefault(),t.defaultPrevented}(),e.match=function(t,e){return r.call(t,e)},r=function(){var t,e,r,n;return t=document.documentElement,null!=(e=null!=(r=null!=(n=t.matchesSelector)?n:t.webkitMatchesSelector)?r:t.msMatchesSelector)?e:t.mozMatchesSelector}(),e.uuid=function(){var t,e,r;for(r="",t=e=1;36>=e;t=++e)r+=9===t||14===t||19===t||24===t?"-":15===t?"4":20===t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16);return r}}).call(this),function(){e.Location=function(){function t(t){var e,r;null==t&&(t=""),r=document.createElement("a"),r.href=t.toString(),this.absoluteURL=r.href,e=r.hash.length,2>e?this.requestURL=this.absoluteURL:(this.requestURL=this.absoluteURL.slice(0,-e),this.anchor=r.hash.slice(1))}var e,r,n,o;return t.wrap=function(t){return t instanceof this?t:new this(t)},t.prototype.getOrigin=function(){return this.absoluteURL.split("/",3).join("/")},t.prototype.getPath=function(){var t,e;return null!=(t=null!=(e=this.requestURL.match(/\/\/[^\/]*(\/[^?;]*)/))?e[1]:void 0)?t:"/"},t.prototype.getPathComponents=function(){return this.getPath().split("/").slice(1)},t.prototype.getLastPathComponent=function(){return this.getPathComponents().slice(-1)[0]},t.prototype.getExtension=function(){var t,e;return null!=(t=null!=(e=this.getLastPathComponent().match(/\.[^.]*$/))?e[0]:void 0)?t:""},t.prototype.isHTML=function(){return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml))$/)},t.prototype.isPrefixedBy=function(t){var e;return e=r(t),this.isEqualTo(t)||o(this.absoluteURL,e)},t.prototype.isEqualTo=function(t){return this.absoluteURL===(null!=t?t.absoluteURL:void 0)},t.prototype.toCacheKey=function(){return this.requestURL},t.prototype.toJSON=function(){return this.absoluteURL},t.prototype.toString=function(){return this.absoluteURL},t.prototype.valueOf=function(){return this.absoluteURL},r=function(t){return e(t.getOrigin()+t.getPath())},e=function(t){return n(t,"/")?t:t+"/"},o=function(t,e){return t.slice(0,e.length)===e},n=function(t,e){return t.slice(-e.length)===e},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.HttpRequest=function(){function r(r,n,o){this.delegate=r,this.requestCanceled=t(this.requestCanceled,this),this.requestTimedOut=t(this.requestTimedOut,this),this.requestFailed=t(this.requestFailed,this),this.requestLoaded=t(this.requestLoaded,this),this.requestProgressed=t(this.requestProgressed,this),this.url=e.Location.wrap(n).requestURL,this.referrer=e.Location.wrap(o).absoluteURL,this.createXHR()}return r.NETWORK_FAILURE=0,r.TIMEOUT_FAILURE=-1,r.timeout=60,r.prototype.send=function(){var t;return this.xhr&&!this.sent?(this.notifyApplicationBeforeRequestStart(),this.setProgress(0),this.xhr.send(),this.sent=!0,"function"==typeof(t=this.delegate).requestStarted?t.requestStarted():void 0):void 0},r.prototype.cancel=function(){return this.xhr&&this.sent?this.xhr.abort():void 0},r.prototype.requestProgressed=function(t){return t.lengthComputable?this.setProgress(t.loaded/t.total):void 0},r.prototype.requestLoaded=function(){return this.endRequest(function(t){return function(){var e;return 200<=(e=t.xhr.status)&&300>e?t.delegate.requestCompletedWithResponse(t.xhr.responseText,t.xhr.getResponseHeader("Turbolinks-Location")):(t.failed=!0,t.delegate.requestFailedWithStatusCode(t.xhr.status,t.xhr.responseText))}}(this))},r.prototype.requestFailed=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.NETWORK_FAILURE)}}(this))},r.prototype.requestTimedOut=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.TIMEOUT_FAILURE)}}(this))},r.prototype.requestCanceled=function(){return this.endRequest()},r.prototype.notifyApplicationBeforeRequestStart=function(){return e.dispatch("turbolinks:request-start",{data:{url:this.url,xhr:this.xhr}})},r.prototype.notifyApplicationAfterRequestEnd=function(){return e.dispatch("turbolinks:request-end",{data:{url:this.url,xhr:this.xhr}})},r.prototype.createXHR=function(){return this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url,!0),this.xhr.timeout=1e3*this.constructor.timeout,this.xhr.setRequestHeader("Accept","text/html, application/xhtml+xml"),this.xhr.setRequestHeader("Turbolinks-Referrer",this.referrer),this.xhr.onprogress=this.requestProgressed,this.xhr.onload=this.requestLoaded,this.xhr.onerror=this.requestFailed,this.xhr.ontimeout=this.requestTimedOut,this.xhr.onabort=this.requestCanceled},r.prototype.endRequest=function(t){return this.xhr?(this.notifyApplicationAfterRequestEnd(),null!=t&&t.call(this),this.destroy()):void 0},r.prototype.setProgress=function(t){var e;return this.progress=t,"function"==typeof(e=this.delegate).requestProgressed?e.requestProgressed(this.progress):void 0},r.prototype.destroy=function(){var t;return this.setProgress(1),"function"==typeof(t=this.delegate).requestFinished&&t.requestFinished(),this.delegate=null,this.xhr=null},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ProgressBar=function(){function e(){this.trickle=t(this.trickle,this),this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement()}var r;return r=300,e.defaultCSS=".turbolinks-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 9999;\n transition: width "+r+"ms ease-out, opacity "+r/2+"ms "+r/2+"ms ease-in;\n transform: translate3d(0, 0, 0);\n}",e.prototype.show=function(){return this.visible?void 0:(this.visible=!0,this.installStylesheetElement(),this.installProgressElement(),this.startTrickling())},e.prototype.hide=function(){return this.visible&&!this.hiding?(this.hiding=!0,this.fadeProgressElement(function(t){return function(){return t.uninstallProgressElement(),t.stopTrickling(),t.visible=!1,t.hiding=!1}}(this))):void 0},e.prototype.setValue=function(t){return this.value=t,this.refresh()},e.prototype.installStylesheetElement=function(){return document.head.insertBefore(this.stylesheetElement,document.head.firstChild)},e.prototype.installProgressElement=function(){return this.progressElement.style.width=0,this.progressElement.style.opacity=1,document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()},e.prototype.fadeProgressElement=function(t){return this.progressElement.style.opacity=0,setTimeout(t,1.5*r)},e.prototype.uninstallProgressElement=function(){return this.progressElement.parentNode?document.documentElement.removeChild(this.progressElement):void 0},e.prototype.startTrickling=function(){return null!=this.trickleInterval?this.trickleInterval:this.trickleInterval=setInterval(this.trickle,r)},e.prototype.stopTrickling=function(){return clearInterval(this.trickleInterval),this.trickleInterval=null},e.prototype.trickle=function(){return this.setValue(this.value+Math.random()/100)},e.prototype.refresh=function(){return requestAnimationFrame(function(t){return function(){return t.progressElement.style.width=10+90*t.value+"%"}}(this))},e.prototype.createStylesheetElement=function(){var t;return t=document.createElement("style"),t.type="text/css",t.textContent=this.constructor.defaultCSS,t},e.prototype.createProgressElement=function(){var t;return t=document.createElement("div"),t.className="turbolinks-progress-bar",t},e}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.BrowserAdapter=function(){function r(r){this.controller=r,this.showProgressBar=t(this.showProgressBar,this),this.progressBar=new e.ProgressBar}var n,o,i;return i=e.HttpRequest,n=i.NETWORK_FAILURE,o=i.TIMEOUT_FAILURE,r.prototype.visitProposedToLocationWithAction=function(t,e){return this.controller.startVisitToLocationWithAction(t,e)},r.prototype.visitStarted=function(t){return t.issueRequest(),t.changeHistory(),t.loadCachedSnapshot()},r.prototype.visitRequestStarted=function(t){return this.progressBar.setValue(0),t.hasCachedSnapshot()||"restore"!==t.action?this.showProgressBarAfterDelay():this.showProgressBar()},r.prototype.visitRequestProgressed=function(t){return this.progressBar.setValue(t.progress)},r.prototype.visitRequestCompleted=function(t){return t.loadResponse()},r.prototype.visitRequestFailedWithStatusCode=function(t,e){switch(e){case n:case o:return this.reload();default:return t.loadResponse()}},r.prototype.visitRequestFinished=function(t){return this.hideProgressBar()},r.prototype.visitCompleted=function(t){return t.followRedirect()},r.prototype.pageInvalidated=function(){return this.reload()},r.prototype.showProgressBarAfterDelay=function(){return this.progressBarTimeout=setTimeout(this.showProgressBar,this.controller.progressBarDelay)},r.prototype.showProgressBar=function(){return this.progressBar.show()},r.prototype.hideProgressBar=function(){return this.progressBar.hide(),clearTimeout(this.progressBarTimeout)},r.prototype.reload=function(){return window.location.reload()},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.History=function(){function r(e){this.delegate=e,this.onPageLoad=t(this.onPageLoad,this),this.onPopState=t(this.onPopState,this)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1):void 0},r.prototype.push=function(t,r){return t=e.Location.wrap(t),this.update("push",t,r)},r.prototype.replace=function(t,r){return t=e.Location.wrap(t),this.update("replace",t,r)},r.prototype.onPopState=function(t){var r,n,o,i;return this.shouldHandlePopState()&&(i=null!=(n=t.state)?n.turbolinks:void 0)?(r=e.Location.wrap(window.location),o=i.restorationIdentifier,this.delegate.historyPoppedToLocationWithRestorationIdentifier(r,o)):void 0},r.prototype.onPageLoad=function(t){return e.defer(function(t){return function(){return t.pageLoaded=!0}}(this))},r.prototype.shouldHandlePopState=function(){return this.pageIsLoaded()},r.prototype.pageIsLoaded=function(){return this.pageLoaded||"complete"===document.readyState},r.prototype.update=function(t,e,r){var n;return n={turbolinks:{restorationIdentifier:r}},history[t+"State"](n,null,e)},r}()}.call(this),function(){e.HeadDetails=function(){function t(t){var e,r,n,s,a,u;for(this.elements={},n=0,a=t.length;a>n;n++)u=t[n],u.nodeType===Node.ELEMENT_NODE&&(s=u.outerHTML,r=null!=(e=this.elements)[s]?e[s]:e[s]={type:i(u),tracked:o(u),elements:[]},r.elements.push(u))}var e,r,n,o,i;return t.fromHeadElement=function(t){var e;return new this(null!=(e=null!=t?t.childNodes:void 0)?e:[])},t.prototype.hasElementWithKey=function(t){return t in this.elements},t.prototype.getTrackedElementSignature=function(){var t,e;return function(){var r,n;r=this.elements,n=[];for(t in r)e=r[t].tracked,e&&n.push(t);return n}.call(this).join("")},t.prototype.getScriptElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("script",t)},t.prototype.getStylesheetElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("stylesheet",t)},t.prototype.getElementsMatchingTypeNotInDetails=function(t,e){var r,n,o,i,s,a;o=this.elements,s=[];for(n in o)i=o[n],a=i.type,r=i.elements,a!==t||e.hasElementWithKey(n)||s.push(r[0]);return s},t.prototype.getProvisionalElements=function(){var t,e,r,n,o,i,s;r=[],n=this.elements;for(e in n)o=n[e],s=o.type,i=o.tracked,t=o.elements,null!=s||i?t.length>1&&r.push.apply(r,t.slice(1)):r.push.apply(r,t);return r},t.prototype.getMetaValue=function(t){var e;return null!=(e=this.findMetaElementByName(t))?e.getAttribute("content"):void 0},t.prototype.findMetaElementByName=function(t){var r,n,o,i;r=void 0,i=this.elements;for(o in i)n=i[o].elements,e(n[0],t)&&(r=n[0]);return r},i=function(t){return r(t)?"script":n(t)?"stylesheet":void 0},o=function(t){return"reload"===t.getAttribute("data-turbolinks-track")},r=function(t){var e;return e=t.tagName.toLowerCase(),"script"===e},n=function(t){var e;return e=t.tagName.toLowerCase(),"style"===e||"link"===e&&"stylesheet"===t.getAttribute("rel")},e=function(t,e){var r;return r=t.tagName.toLowerCase(),"meta"===r&&t.getAttribute("name")===e},t}()}.call(this),function(){e.Snapshot=function(){function t(t,e){this.headDetails=t,this.bodyElement=e}return t.wrap=function(t){return t instanceof this?t:"string"==typeof t?this.fromHTMLString(t):this.fromHTMLElement(t)},t.fromHTMLString=function(t){var e;return e=document.createElement("html"),e.innerHTML=t,this.fromHTMLElement(e)},t.fromHTMLElement=function(t){var r,n,o,i;return o=t.querySelector("head"),r=null!=(i=t.querySelector("body"))?i:document.createElement("body"),n=e.HeadDetails.fromHeadElement(o),new this(n,r)},t.prototype.clone=function(){return new this.constructor(this.headDetails,this.bodyElement.cloneNode(!0))},t.prototype.getRootLocation=function(){var t,r;return r=null!=(t=this.getSetting("root"))?t:"/",new e.Location(r)},t.prototype.getCacheControlValue=function(){return this.getSetting("cache-control")},t.prototype.getElementForAnchor=function(t){try{return this.bodyElement.querySelector("[id='"+t+"'], a[name='"+t+"']")}catch(e){}},t.prototype.getPermanentElements=function(){return this.bodyElement.querySelectorAll("[id][data-turbolinks-permanent]")},t.prototype.getPermanentElementById=function(t){return this.bodyElement.querySelector("#"+t+"[data-turbolinks-permanent]")},t.prototype.getPermanentElementsPresentInSnapshot=function(t){var e,r,n,o,i;for(o=this.getPermanentElements(),i=[],r=0,n=o.length;n>r;r++)e=o[r],t.getPermanentElementById(e.id)&&i.push(e);return i},t.prototype.findFirstAutofocusableElement=function(){return this.bodyElement.querySelector("[autofocus]")},t.prototype.hasAnchor=function(t){return null!=this.getElementForAnchor(t)},t.prototype.isPreviewable=function(){return"no-preview"!==this.getCacheControlValue()},t.prototype.isCacheable=function(){return"no-cache"!==this.getCacheControlValue()},t.prototype.isVisitable=function(){return"reload"!==this.getSetting("visit-control")},t.prototype.getSetting=function(t){return this.headDetails.getMetaValue("turbolinks-"+t)},t}()}.call(this),function(){var t=[].slice;e.Renderer=function(){function e(){}var r;return e.render=function(){var e,r,n,o;return n=arguments[0],r=arguments[1],e=3<=arguments.length?t.call(arguments,2):[],o=function(t,e,r){r.prototype=t.prototype;var n=new r,o=t.apply(n,e);return Object(o)===o?o:n}(this,e,function(){}),o.delegate=n,o.render(r),o},e.prototype.renderView=function(t){return this.delegate.viewWillRender(this.newBody),t(),this.delegate.viewRendered(this.newBody)},e.prototype.invalidateView=function(){return this.delegate.viewInvalidated()},e.prototype.createScriptElement=function(t){var e;return"false"===t.getAttribute("data-turbolinks-eval")?t:(e=document.createElement("script"),e.textContent=t.textContent,e.async=!1,r(e,t),e)},r=function(t,e){var r,n,o,i,s,a,u;for(i=e.attributes,a=[],r=0,n=i.length;n>r;r++)s=i[r],o=s.name,u=s.value,a.push(t.setAttribute(o,u));return a},e}()}.call(this),function(){var t,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;e.SnapshotRenderer=function(e){function o(t,e,r){this.currentSnapshot=t,this.newSnapshot=e,this.isPreview=r,this.currentHeadDetails=this.currentSnapshot.headDetails,this.newHeadDetails=this.newSnapshot.headDetails,this.currentBody=this.currentSnapshot.bodyElement,this.newBody=this.newSnapshot.bodyElement}return n(o,e),o.prototype.render=function(t){return this.shouldRender()?(this.mergeHead(),this.renderView(function(e){return function(){return e.replaceBody(),e.isPreview||e.focusFirstAutofocusableElement(),t()}}(this))):this.invalidateView()},o.prototype.mergeHead=function(){return this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()},o.prototype.replaceBody=function(){var t;return t=this.relocateCurrentBodyPermanentElements(),this.activateNewBodyScriptElements(),this.assignNewBody(),this.replacePlaceholderElementsWithClonedPermanentElements(t)},o.prototype.shouldRender=function(){return this.newSnapshot.isVisitable()&&this.trackedElementsAreIdentical()},o.prototype.trackedElementsAreIdentical=function(){return this.currentHeadDetails.getTrackedElementSignature()===this.newHeadDetails.getTrackedElementSignature()},o.prototype.copyNewHeadStylesheetElements=function(){var t,e,r,n,o;for(n=this.getNewHeadStylesheetElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.copyNewHeadScriptElements=function(){var t,e,r,n,o;for(n=this.getNewHeadScriptElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(this.createScriptElement(t)));return o},o.prototype.removeCurrentHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getCurrentHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.removeChild(t));return o},o.prototype.copyNewHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getNewHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.relocateCurrentBodyPermanentElements=function(){var e,n,o,i,s,a,u;for(a=this.getCurrentBodyPermanentElements(),u=[],e=0,n=a.length;n>e;e++)i=a[e],s=t(i),o=this.newSnapshot.getPermanentElementById(i.id),r(i,s.element),r(o,i),u.push(s);return u},o.prototype.replacePlaceholderElementsWithClonedPermanentElements=function(t){var e,n,o,i,s,a,u;for(u=[],o=0,i=t.length;i>o;o++)a=t[o],n=a.element,s=a.permanentElement,e=s.cloneNode(!0),u.push(r(n,e));return u},o.prototype.activateNewBodyScriptElements=function(){var t,e,n,o,i,s;for(i=this.getNewBodyScriptElements(),s=[],e=0,o=i.length;o>e;e++)n=i[e],t=this.createScriptElement(n),s.push(r(n,t));return s},o.prototype.assignNewBody=function(){return document.body=this.newBody},o.prototype.focusFirstAutofocusableElement=function(){var t;return null!=(t=this.newSnapshot.findFirstAutofocusableElement())?t.focus():void 0},o.prototype.getNewHeadStylesheetElements=function(){return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails)},o.prototype.getNewHeadScriptElements=function(){return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails)},o.prototype.getCurrentHeadProvisionalElements=function(){return this.currentHeadDetails.getProvisionalElements()},o.prototype.getNewHeadProvisionalElements=function(){return this.newHeadDetails.getProvisionalElements()},o.prototype.getCurrentBodyPermanentElements=function(){return this.currentSnapshot.getPermanentElementsPresentInSnapshot(this.newSnapshot)},o.prototype.getNewBodyScriptElements=function(){return this.newBody.querySelectorAll("script")},o}(e.Renderer),t=function(t){var e;return e=document.createElement("meta"),e.setAttribute("name","turbolinks-permanent-placeholder"),e.setAttribute("content",t.id),{element:e,permanentElement:t}},r=function(t,e){var r;return(r=t.parentNode)?r.replaceChild(e,t):void 0}}.call(this),function(){var t=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;e.ErrorRenderer=function(e){function r(t){var e;e=document.createElement("html"),e.innerHTML=t,this.newHead=e.querySelector("head"),this.newBody=e.querySelector("body")}return t(r,e),r.prototype.render=function(t){return this.renderView(function(e){return function(){return e.replaceHeadAndBody(),e.activateBodyScriptElements(),t()}}(this))},r.prototype.replaceHeadAndBody=function(){var t,e;return e=document.head,t=document.body,e.parentNode.replaceChild(this.newHead,e),t.parentNode.replaceChild(this.newBody,t)},r.prototype.activateBodyScriptElements=function(){var t,e,r,n,o,i;for(n=this.getScriptElements(),i=[],e=0,r=n.length;r>e;e++)o=n[e],t=this.createScriptElement(o),i.push(o.parentNode.replaceChild(t,o));return i},r.prototype.getScriptElements=function(){return document.documentElement.querySelectorAll("script")},r}(e.Renderer)}.call(this),function(){e.View=function(){function t(t){this.delegate=t,this.htmlElement=document.documentElement}return t.prototype.getRootLocation=function(){return this.getSnapshot().getRootLocation()},t.prototype.getElementForAnchor=function(t){return this.getSnapshot().getElementForAnchor(t)},t.prototype.getSnapshot=function(){return e.Snapshot.fromHTMLElement(this.htmlElement)},t.prototype.render=function(t,e){var r,n,o;return o=t.snapshot,r=t.error,n=t.isPreview,this.markAsPreview(n),null!=o?this.renderSnapshot(o,n,e):this.renderError(r,e)},t.prototype.markAsPreview=function(t){return t?this.htmlElement.setAttribute("data-turbolinks-preview",""):this.htmlElement.removeAttribute("data-turbolinks-preview")},t.prototype.renderSnapshot=function(t,r,n){return e.SnapshotRenderer.render(this.delegate,n,this.getSnapshot(),e.Snapshot.wrap(t),r)},t.prototype.renderError=function(t,r){return e.ErrorRenderer.render(this.delegate,r,t)},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ScrollManager=function(){function r(r){this.delegate=r,this.onScroll=t(this.onScroll,this),this.onScroll=e.throttle(this.onScroll)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("scroll",this.onScroll,!1),this.started=!1):void 0},r.prototype.scrollToElement=function(t){return t.scrollIntoView()},r.prototype.scrollToPosition=function(t){var e,r;return e=t.x,r=t.y,window.scrollTo(e,r)},r.prototype.onScroll=function(t){return this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},r.prototype.updatePosition=function(t){var e;return this.position=t,null!=(e=this.delegate)?e.scrollPositionChanged(this.position):void 0},r}()}.call(this),function(){e.SnapshotCache=function(){function t(t){this.size=t,this.keys=[],this.snapshots={}}var r;return t.prototype.has=function(t){var e;return e=r(t),e in this.snapshots},t.prototype.get=function(t){var e;if(this.has(t))return e=this.read(t),this.touch(t),e},t.prototype.put=function(t,e){return this.write(t,e),this.touch(t),e},t.prototype.read=function(t){var e;return e=r(t),this.snapshots[e]},t.prototype.write=function(t,e){var n;return n=r(t),this.snapshots[n]=e},t.prototype.touch=function(t){var e,n;return n=r(t),e=this.keys.indexOf(n),e>-1&&this.keys.splice(e,1),this.keys.unshift(n),this.trim()},t.prototype.trim=function(){var t,e,r,n,o;for(n=this.keys.splice(this.size),o=[],t=0,r=n.length;r>t;t++)e=n[t],o.push(delete this.snapshots[e]);return o},r=function(t){return e.Location.wrap(t).toCacheKey()},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Visit=function(){function r(r,n,o){this.controller=r,this.action=o,this.performScroll=t(this.performScroll,this),this.identifier=e.uuid(),this.location=e.Location.wrap(n),this.adapter=this.controller.adapter,this.state="initialized",this.timingMetrics={}}var n;return r.prototype.start=function(){return"initialized"===this.state?(this.recordTimingMetric("visitStart"),this.state="started",this.adapter.visitStarted(this)):void 0},r.prototype.cancel=function(){var t;return"started"===this.state?(null!=(t=this.request)&&t.cancel(),this.cancelRender(),this.state="canceled"):void 0},r.prototype.complete=function(){var t;return"started"===this.state?(this.recordTimingMetric("visitEnd"),this.state="completed","function"==typeof(t=this.adapter).visitCompleted&&t.visitCompleted(this),this.controller.visitCompleted(this)):void 0},r.prototype.fail=function(){var t;return"started"===this.state?(this.state="failed","function"==typeof(t=this.adapter).visitFailed?t.visitFailed(this):void 0):void 0},r.prototype.changeHistory=function(){var t,e;return this.historyChanged?void 0:(t=this.location.isEqualTo(this.referrer)?"replace":this.action,e=n(t),this.controller[e](this.location,this.restorationIdentifier),this.historyChanged=!0)},r.prototype.issueRequest=function(){return this.shouldIssueRequest()&&null==this.request?(this.progress=0,this.request=new e.HttpRequest(this,this.location,this.referrer),this.request.send()):void 0},r.prototype.getCachedSnapshot=function(){var t;return!(t=this.controller.getCachedSnapshotForLocation(this.location))||null!=this.location.anchor&&!t.hasAnchor(this.location.anchor)||"restore"!==this.action&&!t.isPreviewable()?void 0:t},r.prototype.hasCachedSnapshot=function(){return null!=this.getCachedSnapshot()},r.prototype.loadCachedSnapshot=function(){var t,e;return(e=this.getCachedSnapshot())?(t=this.shouldIssueRequest(),this.render(function(){var r;return this.cacheSnapshot(),this.controller.render({snapshot:e,isPreview:t},this.performScroll),"function"==typeof(r=this.adapter).visitRendered&&r.visitRendered(this),t?void 0:this.complete()})):void 0},r.prototype.loadResponse=function(){return null!=this.response?this.render(function(){var t,e;return this.cacheSnapshot(),this.request.failed?(this.controller.render({error:this.response},this.performScroll),"function"==typeof(t=this.adapter).visitRendered&&t.visitRendered(this),this.fail()):(this.controller.render({snapshot:this.response},this.performScroll),"function"==typeof(e=this.adapter).visitRendered&&e.visitRendered(this),this.complete())}):void 0},r.prototype.followRedirect=function(){return this.redirectedToLocation&&!this.followedRedirect?(this.location=this.redirectedToLocation,this.controller.replaceHistoryWithLocationAndRestorationIdentifier(this.redirectedToLocation,this.restorationIdentifier),this.followedRedirect=!0):void 0},r.prototype.requestStarted=function(){var t;return this.recordTimingMetric("requestStart"),"function"==typeof(t=this.adapter).visitRequestStarted?t.visitRequestStarted(this):void 0},r.prototype.requestProgressed=function(t){var e;return this.progress=t,"function"==typeof(e=this.adapter).visitRequestProgressed?e.visitRequestProgressed(this):void 0},r.prototype.requestCompletedWithResponse=function(t,r){return this.response=t,null!=r&&(this.redirectedToLocation=e.Location.wrap(r)),this.adapter.visitRequestCompleted(this)},r.prototype.requestFailedWithStatusCode=function(t,e){return this.response=e,this.adapter.visitRequestFailedWithStatusCode(this,t)},r.prototype.requestFinished=function(){var t;return this.recordTimingMetric("requestEnd"),"function"==typeof(t=this.adapter).visitRequestFinished?t.visitRequestFinished(this):void 0},r.prototype.performScroll=function(){return this.scrolled?void 0:("restore"===this.action?this.scrollToRestoredPosition()||this.scrollToTop():this.scrollToAnchor()||this.scrollToTop(),this.scrolled=!0)},r.prototype.scrollToRestoredPosition=function(){var t,e;return t=null!=(e=this.restorationData)?e.scrollPosition:void 0,null!=t?(this.controller.scrollToPosition(t),!0):void 0},r.prototype.scrollToAnchor=function(){return null!=this.location.anchor?(this.controller.scrollToAnchor(this.location.anchor),!0):void 0},r.prototype.scrollToTop=function(){return this.controller.scrollToPosition({x:0,y:0})},r.prototype.recordTimingMetric=function(t){var e;return null!=(e=this.timingMetrics)[t]?e[t]:e[t]=(new Date).getTime()},r.prototype.getTimingMetrics=function(){return e.copyObject(this.timingMetrics)},n=function(t){switch(t){case"replace":return"replaceHistoryWithLocationAndRestorationIdentifier";case"advance":case"restore":return"pushHistoryWithLocationAndRestorationIdentifier"}},r.prototype.shouldIssueRequest=function(){return"restore"===this.action?!this.hasCachedSnapshot():!0},r.prototype.cacheSnapshot=function(){return this.snapshotCached?void 0:(this.controller.cacheSnapshot(),this.snapshotCached=!0)},r.prototype.render=function(t){return this.cancelRender(),this.frame=requestAnimationFrame(function(e){return function(){return e.frame=null,t.call(e)}}(this))},r.prototype.cancelRender=function(){return this.frame?cancelAnimationFrame(this.frame):void 0},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Controller=function(){function r(){this.clickBubbled=t(this.clickBubbled,this),this.clickCaptured=t(this.clickCaptured,this),this.pageLoaded=t(this.pageLoaded,this),this.history=new e.History(this),this.view=new e.View(this),this.scrollManager=new e.ScrollManager(this),this.restorationData={},this.clearCache(),this.setProgressBarDelay(500)}return r.prototype.start=function(){return e.supported&&!this.started?(addEventListener("click",this.clickCaptured,!0),addEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.start(),this.startHistory(),this.started=!0,this.enabled=!0):void 0},r.prototype.disable=function(){return this.enabled=!1},r.prototype.stop=function(){return this.started?(removeEventListener("click",this.clickCaptured,!0),removeEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.stop(),this.stopHistory(),this.started=!1):void 0},r.prototype.clearCache=function(){return this.cache=new e.SnapshotCache(10)},r.prototype.visit=function(t,r){var n,o;return null==r&&(r={}),t=e.Location.wrap(t),this.applicationAllowsVisitingLocation(t)?this.locationIsVisitable(t)?(n=null!=(o=r.action)?o:"advance",this.adapter.visitProposedToLocationWithAction(t,n)):window.location=t:void 0},r.prototype.startVisitToLocationWithAction=function(t,r,n){var o;return e.supported?(o=this.getRestorationDataForIdentifier(n),this.startVisit(t,r,{restorationData:o})):window.location=t},r.prototype.setProgressBarDelay=function(t){return this.progressBarDelay=t},r.prototype.startHistory=function(){return this.location=e.Location.wrap(window.location),this.restorationIdentifier=e.uuid(),this.history.start(),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.stopHistory=function(){return this.history.stop()},r.prototype.pushHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.push(this.location,this.restorationIdentifier)},r.prototype.replaceHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.historyPoppedToLocationWithRestorationIdentifier=function(t,r){var n;return this.restorationIdentifier=r,this.enabled?(n=this.getRestorationDataForIdentifier(this.restorationIdentifier),this.startVisit(t,"restore",{restorationIdentifier:this.restorationIdentifier,restorationData:n,historyChanged:!0}),this.location=e.Location.wrap(t)):this.adapter.pageInvalidated()},r.prototype.getCachedSnapshotForLocation=function(t){var e;return null!=(e=this.cache.get(t))?e.clone():void 0},r.prototype.shouldCacheSnapshot=function(){return this.view.getSnapshot().isCacheable(); +},r.prototype.cacheSnapshot=function(){var t,r;return this.shouldCacheSnapshot()?(this.notifyApplicationBeforeCachingSnapshot(),r=this.view.getSnapshot(),t=this.lastRenderedLocation,e.defer(function(e){return function(){return e.cache.put(t,r.clone())}}(this))):void 0},r.prototype.scrollToAnchor=function(t){var e;return(e=this.view.getElementForAnchor(t))?this.scrollToElement(e):this.scrollToPosition({x:0,y:0})},r.prototype.scrollToElement=function(t){return this.scrollManager.scrollToElement(t)},r.prototype.scrollToPosition=function(t){return this.scrollManager.scrollToPosition(t)},r.prototype.scrollPositionChanged=function(t){var e;return e=this.getCurrentRestorationData(),e.scrollPosition=t},r.prototype.render=function(t,e){return this.view.render(t,e)},r.prototype.viewInvalidated=function(){return this.adapter.pageInvalidated()},r.prototype.viewWillRender=function(t){return this.notifyApplicationBeforeRender(t)},r.prototype.viewRendered=function(){return this.lastRenderedLocation=this.currentVisit.location,this.notifyApplicationAfterRender()},r.prototype.pageLoaded=function(){return this.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()},r.prototype.clickCaptured=function(){return removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},r.prototype.clickBubbled=function(t){var e,r,n;return this.enabled&&this.clickEventIsSignificant(t)&&(r=this.getVisitableLinkForNode(t.target))&&(n=this.getVisitableLocationForLink(r))&&this.applicationAllowsFollowingLinkToLocation(r,n)?(t.preventDefault(),e=this.getActionForLink(r),this.visit(n,{action:e})):void 0},r.prototype.applicationAllowsFollowingLinkToLocation=function(t,e){var r;return r=this.notifyApplicationAfterClickingLinkToLocation(t,e),!r.defaultPrevented},r.prototype.applicationAllowsVisitingLocation=function(t){var e;return e=this.notifyApplicationBeforeVisitingLocation(t),!e.defaultPrevented},r.prototype.notifyApplicationAfterClickingLinkToLocation=function(t,r){return e.dispatch("turbolinks:click",{target:t,data:{url:r.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationBeforeVisitingLocation=function(t){return e.dispatch("turbolinks:before-visit",{data:{url:t.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationAfterVisitingLocation=function(t){return e.dispatch("turbolinks:visit",{data:{url:t.absoluteURL}})},r.prototype.notifyApplicationBeforeCachingSnapshot=function(){return e.dispatch("turbolinks:before-cache")},r.prototype.notifyApplicationBeforeRender=function(t){return e.dispatch("turbolinks:before-render",{data:{newBody:t}})},r.prototype.notifyApplicationAfterRender=function(){return e.dispatch("turbolinks:render")},r.prototype.notifyApplicationAfterPageLoad=function(t){return null==t&&(t={}),e.dispatch("turbolinks:load",{data:{url:this.location.absoluteURL,timing:t}})},r.prototype.startVisit=function(t,e,r){var n;return null!=(n=this.currentVisit)&&n.cancel(),this.currentVisit=this.createVisit(t,e,r),this.currentVisit.start(),this.notifyApplicationAfterVisitingLocation(t)},r.prototype.createVisit=function(t,r,n){var o,i,s,a,u;return i=null!=n?n:{},a=i.restorationIdentifier,s=i.restorationData,o=i.historyChanged,u=new e.Visit(this,t,r),u.restorationIdentifier=null!=a?a:e.uuid(),u.restorationData=e.copyObject(s),u.historyChanged=o,u.referrer=this.location,u},r.prototype.visitCompleted=function(t){return this.notifyApplicationAfterPageLoad(t.getTimingMetrics())},r.prototype.clickEventIsSignificant=function(t){return!(t.defaultPrevented||t.target.isContentEditable||t.which>1||t.altKey||t.ctrlKey||t.metaKey||t.shiftKey)},r.prototype.getVisitableLinkForNode=function(t){return this.nodeIsVisitable(t)?e.closest(t,"a[href]:not([target]):not([download])"):void 0},r.prototype.getVisitableLocationForLink=function(t){var r;return r=new e.Location(t.getAttribute("href")),this.locationIsVisitable(r)?r:void 0},r.prototype.getActionForLink=function(t){var e;return null!=(e=t.getAttribute("data-turbolinks-action"))?e:"advance"},r.prototype.nodeIsVisitable=function(t){var r;return(r=e.closest(t,"[data-turbolinks]"))?"false"!==r.getAttribute("data-turbolinks"):!0},r.prototype.locationIsVisitable=function(t){return t.isPrefixedBy(this.view.getRootLocation())&&t.isHTML()},r.prototype.getCurrentRestorationData=function(){return this.getRestorationDataForIdentifier(this.restorationIdentifier)},r.prototype.getRestorationDataForIdentifier=function(t){var e;return null!=(e=this.restorationData)[t]?e[t]:e[t]={}},r}()}.call(this),function(){!function(){var t,e;if((t=e=document.currentScript)&&!e.hasAttribute("data-turbolinks-suppress-warning"))for(;t=t.parentNode;)if(t===document.body)return console.warn("You are loading Turbolinks from a